我有一些批处理脚本用于自动化应用程序构建过程,其中大多数涉及使用&&
运算符将命令链接在一起。不可否认,我在Linux方面经验丰富,但基于这种体验some_command && other_command
应导致other_command
运行 iff some_command
返回退出代码0 。 This answer和this answer似乎同意这一点。但是,在Windows cmd.exe中似乎不是这种情况,所有脚本都会运行,无论前一个错误代码如何。
我决定对此做一个简单的测试,以说服自己我不会疯狂。考虑这个test.bat
,它返回退出代码1:
@echo off
EXIT /B 1
正在运行test.bat && echo This shouldn't print
打印'这不应该打印'但由于退出代码显然是1,echo
应该不被调用。我已经使用%errorlevel%
变量测试了错误代码实际为1,它们按预期出现(在我运行脚本之前为0,之后为1)。
在Linux上我尝试了同样的事情。这是test.sh
:
#!/bin/bash
exit 1
运行./test.sh && echo "This shouldn't print"
没有输出,正是我所期望的。
这里发生了什么?
(注意:操作系统是Windows 7企业版)
答案 0 :(得分:6)
您需要使用call
来运行批处理脚本,如下所示:
call test.bat && echo This shouldn't print
如果没有call
,则&&
运算符不会收到批处理脚本返回的ErrorLevel
。
当您从另一个批处理文件中运行批处理文件时,您需要使用call
才能返回到调用批处理文件;如果没有call
,一旦被调用的批处理文件完成,执行就会终止......:
call test.bat
echo This is going to be displayed.
...但:
test.bat
echo You will never see this!
当组合多个命令的命令行中涉及运行test.bat
时(使用串联运算符&
,条件运算符&&
和||
,甚至是即使未使用()
,括号test.bat
)内的代码块也会被调整。call
之后的所有命令都会被调整。这是因为命令解释器已经解析了整个命令行/块。
但是,当使用call
时,将收到批处理文件返回的ErrorLevel
值(在我们的情况下为1
),并且以下命令的行为相应:
call test.bat & echo This is always printed.
echo And this is also always printed.
call test.bat && echo This is not printed.
call test.bat || echo But this is printed.
(
call test.bat
echo This is printed too.
echo And again this also.
)
call test.bat & if ErrorLevel 1 echo This is printed.
但是没有call
你就会得到这个......:
test.bat & echo This is printed.
echo But this is not!
...和...
test.bat && echo Even this is printed!
echo Neither is this!
...和...
test.bat || echo But this is not printed!
echo And this is not either!
...和
(
call test.bat
echo This is printed.
echo And this as well.
)
似乎&&
和||
运算符会收到ErrorLevel
0
- 即使ErrorLevel
已在test.bat
之前设置奇怪地执行了。此外,当使用if ErrorLevel
时,行为类似:
test.bat & if ErrorLevel 1 echo This is not printed!
...和...
set = & rem This constitutes a syntax error.
test.bat & if ErrorLevel 1 echo This is still not printed!
请注意,test.bat
后面的命令在批处理脚本后执行,即使没有call
。