中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [1] [2] »
作者:
标题: [求助]批量处理文件的写法 上一主题 | 下一主题
dwing
初级用户





积分 177
发帖 32
注册 2003-10-6
状态 离线
『楼 主』:  [求助]批量处理文件的写法

我写了一个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 楼』:  

未测试
@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 错误




第一高手    第二高手

2007-12-17 18:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 3 楼』:  

楼主是要求,至少有一个处理错误,最后显示"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 楼』:  

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

这样的批处理太有用了,以后再写以单文件为单位的文件处理程序就只考虑一个文件就可以了,不用再考虑通配符.



http://wex.cn/dwing
2007-12-18 10:10
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
dwing
初级用户





积分 177
发帖 32
注册 2003-10-6
状态 离线
『第 5 楼』:  

忽然又发现问题了:

@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 楼』:  

嘿嘿
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 楼』:  

楼上的写法也不错.
只不过一般程序的返回值都设定为<0表示错误,而不一定是-1.
而call命令后面可以接set却不能接if, ()里的语句还被看作是一行的, 批处理语言设计的真糟糕...



http://wex.cn/dwing
2007-12-18 13:40
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
dwing
初级用户





积分 177
发帖 32
注册 2003-10-6
状态 离线
『第 8 楼』:  

哈哈...这样写就得到正确结果了:

@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 楼』:  

额,我是看你说不成功返回-1
()不是被看作一行的,而是看作一个命令集
我不是学编程的,批处理语言的主要作用还是直观,完全可以通过示例代码来让人轻松掌握而不需要去了解编程语言的基础概念

2007-12-18 13:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复
huahua0919
银牌会员




积分 1608
发帖 780
注册 2007-10-7
状态 离线
『第 10 楼』:  



  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!
不知可否?

2007-12-18 14:37
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
dwing
初级用户





积分 177
发帖 32
注册 2003-10-6
状态 离线
『第 11 楼』:  



  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的批处理有区别.



http://wex.cn/dwing
2007-12-18 15:16
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
front
新手上路





积分 8
发帖 4
注册 2007-11-12
来自 福建
状态 离线
『第 12 楼』:  

set /a err=%err%+1",一个是"set /a err+=1是同一个意思,不是用不同的方式表达而已set .a err+=1就是简便

2007-12-18 20:41
查看资料  发送邮件  发短消息 网志  OICQ (454973527)  编辑帖子  回复  引用回复
dwing
初级用户





积分 177
发帖 32
注册 2003-10-6
状态 离线
『第 13 楼』:  



  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%



http://wex.cn/dwing
2007-12-18 21:52
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 14 楼』:  

set /a的运算特性在部分情况下不需要延缓支持就可以实时刷新

2007-12-18 22:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
honghunter
中级用户





积分 321
发帖 135
注册 2007-2-4
状态 离线
『第 15 楼』:  

为什么很多人都喜欢开启延迟变量哪?



探讨批量下载与智能化的下载
2007-12-18 23:31
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: