Board logo

标题: [求助]批量处理文件的写法 [打印本页]

作者: dwing     时间: 2007-12-17 18:36    标题: [求助]批量处理文件的写法

我写了一个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=

作者: fastslz     时间: 2007-12-17 18:56
未测试
@echo off
set 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 off
for /d %%a in (*.txt) do dotxt %%a || echo 错误

作者: 26933062     时间: 2007-12-17 19:16
楼主是要求,至少有一个处理错误,最后显示"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

作者: dwing     时间: 2007-12-18 10:10
感谢fastslz, 学到了用"||"代替errorlevel的用法.
但需要略作修改才能正常运行.就是for不能加"/d"参数,否则一个文件都没处理.
3楼的代码没能正常运行,总是显示"error!".

这样的批处理太有用了,以后再写以单文件为单位的文件处理程序就只考虑一个文件就可以了,不用再考虑通配符.
作者: dwing     时间: 2007-12-18 10:54
忽然又发现问题了:

@echo off
setlocal
set err=0
for %%a in (*.txt) do dotxt %%a || set /a err=%err%+1
echo 错误文件数:%err%

没有错误时,可以显示"错误文件数:0".
但无论出现几个错误,都显示"错误文件数:1", 这是为什么?
作者: everest79     时间: 2007-12-18 11:17
嘿嘿
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
作者: dwing     时间: 2007-12-18 13:40
楼上的写法也不错.
只不过一般程序的返回值都设定为<0表示错误,而不一定是-1.
而call命令后面可以接set却不能接if, ()里的语句还被看作是一行的, 批处理语言设计的真糟糕...
作者: dwing     时间: 2007-12-18 13:51
哈哈...这样写就得到正确结果了:

@echo off
setlocal
set err=0
for %%a in (*.txt) do dotxt %%a || set /a err+=1
echo 错误文件数:%err%

感谢楼上几位支持!
作者: everest79     时间: 2007-12-18 13:52
额,我是看你说不成功返回-1
()不是被看作一行的,而是看作一个命令集
我不是学编程的,批处理语言的主要作用还是直观,完全可以通过示例代码来让人轻松掌握而不需要去了解编程语言的基础概念
作者: huahua0919     时间: 2007-12-18 14:37


  Quote:
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!
不知可否?
作者: dwing     时间: 2007-12-18 15:16


  Quote:
Originally posted by huahua0919 at 2007-12-18 14:37:

这个估计还是不行吧,和你上面的没什么区别啊 应该改成!err!
不知可否?

与上面的写法当然有区别,一个是"set /a err=%err%+1",一个是"set /a err+=1"
这两句在for语句中是有区别的(糟糕的批处理语言).

我已经测试多次"echo %err%"的写法均得到正确结果,平台是WinXP(sp2).也许与DOS/Win9x的批处理有区别.
作者: front     时间: 2007-12-18 20:41
set /a err=%err%+1",一个是"set /a err+=1是同一个意思,不是用不同的方式表达而已set .a err+=1就是简便
作者: dwing     时间: 2007-12-18 21:52


  Quote:
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%
作者: everest79     时间: 2007-12-18 22:19
set /a的运算特性在部分情况下不需要延缓支持就可以实时刷新
作者: honghunter     时间: 2007-12-18 23:31
为什么很多人都喜欢开启延迟变量哪?
作者: fastslz     时间: 2007-12-18 23:48


  Quote:
Originally posted by honghunter at 2007-12-18 23:31:
为什么很多人都喜欢开启哪?

问的好!!个人认为在不必开启变量延迟的时候尽量避免开启,否则久而久之纯DOS下麻木不堪,所以我喜欢用 call 标签和|find "..." if errorlevel ..以及shift,毕竟这些用法CMD和纯DOS存在共性。
作者: sonicandy     时间: 2007-12-19 22:26
您可以在脚本说明中注明兼容
操作系统:)