【发布时间】:2015-09-19 08:17:25
【问题描述】:
考虑一个名为 t.cmd 的命令脚本,它仅包含以下两行:
@exit /b 123
@echo If you see this, THEN EXIT FAILED..
所以,脚本只是将脚本执行过程的退出码设置为123,并没有杀死cmd.exe。最后的 echo 确认 exit 实际上会导致立即返回(其输出不应出现)。
现在执行这个脚本,然后打印出%errorlevel%:
>t.cmd
>echo %errorlevel%
123
到目前为止一切顺利:一切都完全符合预期。
但是现在在一行上执行以上所有内容,使用 && 进行条件执行:
>t.cmd && echo %errorlevel%
123
我不希望这样:如果 t.cmd 真的返回一个非 0 退出代码,那么它应该停止 && 之后的所有内容(即回显)执行。我们看到它打印的事实意味着它确实执行了。到底是怎么回事?
如果在一行上执行以上所有操作,使用 ||对于条件执行:
>t.cmd || echo %errorlevel%
>
这种行为也与我的预期相反(尽管它与上面的 && 行为一致)。
请注意,这种奇怪的行为仅适用于 bat 文件,但不适用于“原始命令”。
证明:考虑以下命令行交互,我尝试执行虚假命令 abcdef,而不是调用 t.cmd:
>abcdef
'abcdef' is not recognized as an internal or external command,
operable program or batch file.
>echo %errorlevel%
9009
>abcdef && echo %errorlevel%
'abcdef' is not recognized as an internal or external command,
operable program or batch file.
>abcdef || echo %errorlevel%
'abcdef' is not recognized as an internal or external command,
operable program or batch file.
9009
这里,&& 和 ||立即查看失败的虚假命令的退出代码。
那么为什么 cmd 文件的行为会有所不同呢?
在File redirection in Windows and %errorlevel%中发现了一个可能与cmd.exe相关的错误
另外,我知道ERRORLEVEL is not %ERRORLEVEL%
顺便说一句,上面的代码都是在 Win 7 Pro 64 位机器上执行的。我不知道其他版本的 Windows 行为如何。
【问题讨论】:
-
只是说,批量只需要一个
&或| -
@Monacraft -
&和&&是完全不同的东西,|和||也是如此。
标签: windows batch-file cmd