Board logo

标题: [其他] 在只有一个子文件夹的目录内代码运行不正常 [打印本页]

作者: tireless    时间: 2009-7-31 22:48     标题: 在只有一个子文件夹的目录内代码运行不正常

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

[ 本帖最后由 tireless 于 2009-7-31 23:07 编辑 ]
作者: namejm    时间: 2009-7-31 23:07

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

______________________________

以上说法似乎有误,正在验证中
作者: tireless    时间: 2009-7-31 23:15

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

而我在目录内多建一个文件夹,又会显示 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:\新建文件夹>

作者: zqz0012005    时间: 2009-8-1 05:33

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 还发生了改变。
作者: zqz0012005    时间: 2009-8-1 13:49

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

运行 cmd /vn ,将%errorlevel%换成!errorlevel!
作者: Lumiere    时间: 2009-8-1 16:20

在根目录下运行,不管盘下有多少个文件,都不会显示error,很有意思勒,在一级目录下有一个文件夹也不会显示error,有俩以上就会显示。难道只有俩文件夹的时候就会执行出错?不可思议
作者: netbenton    时间: 2009-8-1 21:32

看来错误返回码是乱的

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

以上仅为个人猜想




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2