|  | 
 
| dwing 初级用户
 
   
 
 
 
 积分 177
 发帖 32
 注册 2003-10-6
 状态 离线
 | 
| 『楼 主』:
 [求助]批量处理文件的写法
 
使用 LLM 解释/回答一下 
 
 
我写了一个exe程序可以对一个txt文件处理,处理正确返回0,处理错误返回-1.我要对当前目录所有txt文件全部做处理,如果至少有一个处理错误,最后显示"error!",否则显示"ok!".
 如何用bat批处理实现?
 
 我写了一个,结果不正确,能修正一下也可以:
 
 @echo off
 set err=0
 for %%a in (*.txt) do (
 dotxt %%a
 if %errorlevel% equ -1 set err=1
 )
 if %err% equ 0 goto ok
 echo error!
 goto end
 :ok
 echo ok!
 :end
 set err=
 
 
 
 
 
 |  
                  |  http://wex.cn/dwing
 |  | 
|  2007-12-17 18:36 |  | 
|  | 
 
| fastslz 铂金会员
 
        DOS一根葱
 
 
 积分 5493
 发帖 2315
 注册 2006-5-1
 来自 上海
 状态 离线
 | 
| 『第 2 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
未测试 @echo offset err=0
 for /d %%a in (*.txt) do dotxt %%a || set /a err=%err%+1
 if %err% equ 0 echo ok
 if %err% geq 1 echo %err%个错误
 pause
 
更简洁点
 @echo offfor /d %%a in (*.txt) do dotxt %%a || echo 错误
 
 
 
 
 |  
                  |  第一高手    第二高手
 我的小站
 
  |  | 
|  2007-12-17 18:56 |  | 
|  | 
 
| 26933062 银牌会员
 
      
 
 
 
 积分 2268
 发帖 879
 注册 2006-12-19
 状态 离线
 | 
| 『第 3 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
楼主是要求,至少有一个处理错误,最后显示"error!",否则显示"ok!". 
是否要这样? 开启延迟变量试试. 
: @echo off
 setlocal enabledelayedexpansion
 for %%a in (*.txt) do (
 dotxt %%a
 if !errorlevel! equ -1 set err=1
 )
 if defined err (echo error!) else echo ok
 pause
 
 
 
 
 
 |  
                  |  致精致简!
 |  | 
|  2007-12-17 19:16 |  | 
|  | 
 
| dwing 初级用户
 
   
 
 
 
 积分 177
 发帖 32
 注册 2003-10-6
 状态 离线
 | 
| 『第 4 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
感谢fastslz, 学到了用"||"代替errorlevel的用法.但需要略作修改才能正常运行.就是for不能加"/d"参数,否则一个文件都没处理.
 3楼的代码没能正常运行,总是显示"error!".
 
 这样的批处理太有用了,以后再写以单文件为单位的文件处理程序就只考虑一个文件就可以了,不用再考虑通配符.
 
 
 
 
 
 |  
                  |  http://wex.cn/dwing
 |  | 
|  2007-12-18 10:10 |  | 
|  | 
 
| dwing 初级用户
 
   
 
 
 
 积分 177
 发帖 32
 注册 2003-10-6
 状态 离线
 | 
| 『第 5 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
忽然又发现问题了:
 @echo off
 setlocal
 set err=0
 for %%a in (*.txt) do dotxt %%a || set /a err=%err%+1
 echo 错误文件数:%err%
 
 没有错误时,可以显示"错误文件数:0".
 但无论出现几个错误,都显示"错误文件数:1", 这是为什么?
 
 
 
 
 
 |  
                  |  http://wex.cn/dwing
 |  | 
|  2007-12-18 10:54 |  | 
|  | 
 
| everest79 金牌会员
 
       一叶枝头,万树皆春
 
 
 
 积分 2564
 发帖 1127
 注册 2006-12-25
 状态 离线
 | 
| 『第 6 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
嘿嘿set num=0
 for %%a in (*.txt) do (
 dotxt %%a
 call set /a num+=%%errorlevel%%
 )
 set/a 1/num&&echo err %num:~1%||echo ok
 
 
 
 
 |  | 
|  2007-12-18 11:17 |  | 
|  | 
 
| dwing 初级用户
 
   
 
 
 
 积分 177
 发帖 32
 注册 2003-10-6
 状态 离线
 | 
| 『第 7 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
楼上的写法也不错.只不过一般程序的返回值都设定为<0表示错误,而不一定是-1.
 而call命令后面可以接set却不能接if, ()里的语句还被看作是一行的, 批处理语言设计的真糟糕...
 
 
 
 
 
 |  
                  |  http://wex.cn/dwing
 |  | 
|  2007-12-18 13:40 |  | 
|  | 
 
| dwing 初级用户
 
   
 
 
 
 积分 177
 发帖 32
 注册 2003-10-6
 状态 离线
 | 
| 『第 8 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
哈哈...这样写就得到正确结果了:
 @echo off
 setlocal
 set err=0
 for %%a in (*.txt) do dotxt %%a || set /a err+=1
 echo 错误文件数:%err%
 
 感谢楼上几位支持!
 
 
 
 
 
 |  
                  |  http://wex.cn/dwing
 |  | 
|  2007-12-18 13:51 |  | 
|  | 
 
| everest79 金牌会员
 
       一叶枝头,万树皆春
 
 
 
 积分 2564
 发帖 1127
 注册 2006-12-25
 状态 离线
 | 
| 『第 9 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
额,我是看你说不成功返回-1()不是被看作一行的,而是看作一个命令集
 我不是学编程的,批处理语言的主要作用还是直观,完全可以通过示例代码来让人轻松掌握而不需要去了解编程语言的基础概念
 
 
 
 
 |  | 
|  2007-12-18 13:52 |  | 
|  | 
 
| huahua0919 银牌会员
 
      
 
 
 积分 1608
 发帖 780
 注册 2007-10-7
 状态 离线
 | 
| 『第 10 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
Originally posted by dwing at 2007-12-18 01:51 PM:哈哈...这样写就得到正确结果了:
 
 @echo off
 setlocal
 set err=0
 for %%a in (*.txt) do dotxt %%a || set /a err+=1
 echo 错误文件数:%err%
 感谢楼上几位支持!
 
这个估计还是不行吧,和你上面的没什么区别啊 应该改成!err! 
不知可否? 
 
 
 
 |  | 
|  2007-12-18 14:37 |  | 
|  | 
 
| dwing 初级用户
 
   
 
 
 
 积分 177
 发帖 32
 注册 2003-10-6
 状态 离线
 | 
| 『第 11 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
Originally posted by huahua0919 at 2007-12-18 14:37:
 这个估计还是不行吧,和你上面的没什么区别啊 应该改成!err!
 不知可否?
 
与上面的写法当然有区别,一个是"set /a err=%err%+1",一个是"set /a err+=1" 
这两句在for语句中是有区别的(糟糕的批处理语言<img src="images/smilies/face-raspberry.png" align="absmiddle" border="0">).
 
我已经测试多次"echo %err%"的写法均得到正确结果,平台是WinXP(sp2).也许与DOS/Win9x的批处理有区别. 
 
 
 
 
 |  
                  |  http://wex.cn/dwing
 |  | 
|  2007-12-18 15:16 |  | 
|  | 
 
| front 新手上路
 
  
 
 
 
 积分 8
 发帖 4
 注册 2007-11-12
 来自 福建
 状态 离线
 | 
| 『第 12 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
set /a err=%err%+1",一个是"set /a err+=1是同一个意思,不是用不同的方式表达而已set .a err+=1就是简便 
 
 
 
 |  | 
|  2007-12-18 20:41 |  | 
|  | 
 
| dwing 初级用户
 
   
 
 
 
 积分 177
 发帖 32
 注册 2003-10-6
 状态 离线
 | 
| 『第 13 楼』:
 
 
使用 LLM 解释/回答一下 
 
 
Originally posted by front at 2007-12-18 20:41:set /a err=%err%+1",一个是"set /a err+=1是同一个意思,不是用不同的方式表达而已set .a err+=1就是简便
 
你试一下这个批处理(统计当前目录文件数),就知道区别了:
 
@echo off 
setlocal
 
set num=0 
for %%a in (*) do set /a num+=1 
echo %num%
 
set num=0 
for %%a in (*) do set /a num=%num%+1 
echo %num% 
 
 
 
 
 |  
                  |  http://wex.cn/dwing
 |  | 
|  2007-12-18 21:52 |  | 
|  | 
 
| everest79 金牌会员
 
       一叶枝头,万树皆春
 
 
 
 积分 2564
 发帖 1127
 注册 2006-12-25
 状态 离线
 |  | 
|  2007-12-18 22:19 |  | 
|  | 
 
| honghunter 中级用户
 
    
 
 
 
 积分 321
 发帖 135
 注册 2007-2-4
 状态 离线
 |  | 
|  2007-12-18 23:31 |  |