使用条件执行时,如何在 Windows 上访问退出代码的上一个命令?

使用条件执行时,如何在 Windows 上访问退出代码的上一个命令?

我想将退出代码(不是stdoutstderr)输入到 Windows cmd 上的命令中。

c:\>echo Initial command that exits with 0 && cmd /C "exit 0"

c:\>cmd /c "exit 1" || echo Error level: %errorlevel%, but should be 1
Error level: 0, but should be 1
c:\>cmd /c "exit 2" || echo Error level: %errorlevel%, but should be 0
Error level: 1, but should be 2

似乎可以立即进行评估。有没有%errorlevel%类似的方法?$?bash

答案1

问题是,在解析时,行内%errorlevel%的内容会被展开。请阅读cmd /c "exit 1" || echo Error level: %errorlevel%延迟扩张文章:

延迟扩展将导致批处理文件中的变量在执行时扩展,而不是在解析时扩展

d:\bat> cmd /V:ON /c "(cmd /C exit 5) || echo Error level: !errorlevel!"
Error level: 5

d:\bat> cmd /V:ON /c "(cmd /C exit 1) || echo Error level: !errorlevel!"
Error level: 1

d:\bat> cmd /V:ON /c "(cmd /C exit -1) || echo Error level: !errorlevel!"
Error level: -1

答案2

将第一个命令的成功或失败(但不是实际的错误级别)输入到第二个命令中:

cmd1 && cmd2 0 || cmd2 1

这可能不完全是原始问题的答案,但它帮助我解决了似乎与原始问题相关的用例:

@mvn.cmd %* && playsound success || playsound failure

作为替代方案

@echo off
setlocal enableDelayedExpansion
call mvn.cmd %* & playsound !errorlevel!

相关内容