错误代码似乎被'&&'在Windows命令提示符下

时间:2016-08-03 13:52:59

标签: windows batch-file

我有一些批处理脚本用于自动化应用程序构建过程,其中大多数涉及使用&&运算符将命令链接在一起。不可否认,我在Linux方面经验丰富,但基于这种体验some_command && other_command应导致other_command运行 iff some_command返回退出代码0 This answerthis 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企业版)

1 个答案:

答案 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