我想将退出代码(不是stdout
或stderr
)输入到 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!