[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] 在只有一个子文件夹的目录内代码运行不正常

  1. (for /r %a in (*.bathome) do echo %a) || echo error
复制代码
例如,在 D:\新建文件夹 内有一个文件夹且只有一个,运行这个代码不会显示 error。

[ 本帖最后由 tireless 于 2009-7-31 23:07 编辑 ]

  1、最里面的括号内不存在 *.bathome 这一元素,所以,echo 语句不会有输出结果;
  2、即使 echo 语句没有输出结果,但是,整个for语句不存在语法错误,也不存在执行错误,所以,整个for语句的执行是成功的;
  3、因为 || 之前的语句执行成功,所以,|| 后的语句不会得到执行。

______________________________

以上说法似乎有误,正在验证中
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

我是这么理解的,() 内的代码没有执行成功,所以会执行 ()|| 后的命令。

而我在目录内多建一个文件夹,又会显示 error:

D:\新建文件夹>dir /s /b
D:\新建文件夹\a

D:\新建文件夹>(for /r %a in (*.bathome) do echo %a) || echo error

D:\新建文件夹>md b

D:\新建文件夹>dir /s /b
D:\新建文件夹\a
D:\新建文件夹\b

D:\新建文件夹>(for /r %a in (*.bathome) do echo %a) || echo error
error

D:\新建文件夹>

TOP

for命令的错误返回码本身就是很复杂的(曾在verybat上讨论过一部分,未果)。
jm说的第一条是对的,循环集为空时,do子句不会执行。
do子句不执行,仅是子句的命令不影响errorlevel。
但for是怎么处理循环集为空这种情况,怎么影响errorlevel,还是求知的。
D:\test>dir /a/s/b
D:\test\a

D:\test>(for %a in (*.bathome) do echo %a) && echo ok+%errorlevel% || echo error+
%errorlevel%
error+0

D:\test>(for /r %a in (*.bathome) do echo %a) && echo ok+%errorlevel% || echo err
or+%errorlevel%
ok+2090002720

D:\test>(for %a in (*.bathome) do echo %a) && echo ok+%errorlevel%|| echo error+
%errorlevel%
error+2090002720

D:\test>md b

D:\test>(for %a in (*.bathome) do echo %a) && echo ok+%errorlevel%|| echo error+
%errorlevel%
error+0

D:\test>(for /r %a in (*.bathome) do echo %a) && echo ok+%errorlevel%|| echo err
or+%errorlevel%
error+2090002720

D:\test>(for %a in (*.bathome) do echo %a) && echo ok+%errorlevel%|| echo error+
%errorlevel%
error+1420992

D:\test>(for /r %a in (*.bathome) do echo %a) && echo ok+%errorlevel%|| echo err
or+%errorlevel%
error+2090002720

D:\test>(for %a in (*.bathome) do echo %a) && echo ok+%errorlevel%|| echo error+
%errorlevel%
error+1421208

注意看,errorlevel 还发生了改变。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

又忘了,应该使用延迟的变量。

运行 cmd /vn ,将%errorlevel%换成!errorlevel!
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

在根目录下运行,不管盘下有多少个文件,都不会显示error,很有意思勒,在一级目录下有一个文件夹也不会显示error,有俩以上就会显示。难道只有俩文件夹的时候就会执行出错?不可思议
Still with wax

TOP

看来错误返回码是乱的

应该是对于这种情况,应该是cmd的bug,它并没有去规定返回码是多少所至,而是只要一出错就退出返回提示符。
就像汇编调用退出中断一样:
mov ah,4c
int 21
就可以退出,而没有设置:mov al,?
以至于运行到不同地方就有不同的返回码,当然也有可能为0,造成了正常退出的假像。

以上仅为个人猜想

TOP

返回列表