问题
运算&&
符不尊重该值。尽管等于 99,%ErrorLevel%
运算符后面的命令仍会运行。%ErrorLevel%
命令
cmd /c exit 99 echo %ErrorLevel% echo %ErrorLevel% && echo %ErrorLevel% echo %ErrorLevel%
输出
99 99 99 99
进一步探讨这个问题
根据我的理解,以下是正确的:
- 该
&&
运算符相当于if "%ErrorLevel%" equ "0"
。 - 该
Echo
命令不会改变%ErrorLevel%
。
故障排除
我尝试使用并运行以下命令来启用延迟扩展cmd /v:on
,但它给出了相同的输出。我在控制台、.bat 文件和 .cmd 文件中测试了以下命令。
setlocal EnableDelayedExpansion
cmd /c exit 99
echo %ErrorLevel%
echo %ErrorLevel% && echo !ErrorLevel!
echo %ErrorLevel%
使用if
命令可将行为更改为我期望的行为。将以下代码更改为替换cmd /c exit 99
确实cmd /c exit 0
会将输出更改为 3 个 99 的回声,而不是 4 个 99 的回声。
命令
setlocal EnableDelayedExpansion cmd /c exit 99 echo %ErrorLevel% echo %ErrorLevel% & if "%ErrorLevel%" equ "0" echo !ErrorLevel! echo %ErrorLevel%
输出
99 99 99
回答
wildkoala的答案似乎是正确的。&&
and||
运算符检查前一个命令的退出代码,而不是 %ErrorLevel% 变量中的当前值。
有些命令不会更新 %ErrorLevel% 变量。但是,它们仍会有一个退出代码。
您可以在此处阅读有关 ss64 中错误级别和退出代码之间的区别的更多信息。
&&
文档通常将and运算符的解释简化||
为评估 %ErrorLevel% 是否为 0。
如何评估命令的退出代码
您可以在以要评估的命令结尾的变量或脚本上使用该call
命令。这样做将强制使用最后一个命令的退出代码更新 %ErrorLevel% 变量。
例子
cmd /v:on
set command1=cmd /c exit 99
set command2=echo hide output^>nul
%command1% & echo !ErrorLevel!
99
%command2% & echo !ErrorLevel!
99
call %command2% & echo !ErrorLevel!
0
call %command1% & echo !ErrorLevel!
99
操作
&&
员仅检查前一个命令的退出状态,在本例中为echo %ErrorLevel%
,而不是%ErrorLevel%
其本身。即使您的前一个命令导致%ErrorLevel%
更改,&&
也不会对其进行评估。因此,如果返回退出代码 0(确实如此,因为它执行成功),
echo %ErrorLevel% && echo %ErrorLevel%
则将运行。因此,正如您所发现的,有必要改用 if 语句。echo %ErrorLevel%