如何检查批处理文件中最后一个命令的退出代码?

Mis*_*hko 85 batch windows-xp

在 Windows 上的批处理文件中,我使用7-zip如下:

...\right_path\7z a output_file_name.zip file_to_be_compressed
Run Code Online (Sandbox Code Playgroud)

我如何检查 的退出代码7z并采取适当的措施?

Den*_*son 99

测试返回码是否大于或等于 1:

if ERRORLEVEL 1 echo Error
Run Code Online (Sandbox Code Playgroud)

或者

if %ERRORLEVEL% GEQ 1 echo Error
Run Code Online (Sandbox Code Playgroud)

或测试返回码等于 0:

if %ERRORLEVEL% EQU 0 echo OK
Run Code Online (Sandbox Code Playgroud)

您可以使用其他命令,例如GOTOwhere I show echo

  • 请注意,错误级别 [不是环境变量](http://blogs.msdn.com/b/oldnewthing/archive/2008/09/26/8965755.aspx)。这是[陷阱和微妙之处]的一个很好的总结(http://stackoverflow.com/questions/10935693/foolproof-way-to-check-for-nonzero-error-return-code-in-windows-batch-file) . (4认同)
  • @Misha:您可能已经按照我最初发布的方式尝试使用百分号。在没有它们的情况下尝试或尝试我添加的其他版本。 (2认同)
  • 发现即使发生错误,“%ERRORLEVEL%”仍为 0 的情况。在 cmd 文件中检查 `%ERRORLEVEL%` 时发生。尝试 `start /wait` 没有用。唯一有效的是`if errorlevel 1 (...)` (2认同)

Jon*_*ica 12

当您有以下情况时,这确实有效:App1.exe 调用 -> .bat 运行 --> app2.exe

App2 返回错误级别 1...但您需要在 .bat 中捕获它并将其重新提升到 app1...否则 .bat 会吃掉错误级别而 app1 永远不知道。

方法:

在 .bat 中:

app2.exe
if %ERRORLEVEL% GEQ 1 EXIT /B 1
Run Code Online (Sandbox Code Playgroud)

这是在 app2 之后检查错误级别。如果 > 0,则 .bat 退出并将调用 app1 的错误级别设置为 1。

  • 如果您将相同的错误返回给 app1,效果会更好。我没有试过这个,但它应该可以工作:`if %ERRORLEVEL% GEQ 1 EXIT /B %ERRORLEVEL%`。 (5认同)
  • 至少在 Windows 中,%ERRORLEVEL% 可以是一个负数(例如,我有一个程序在出错时返回 -1)。`IF %ERRORLEVEL% NEQ 0 EXIT /B %ERRORLEVEL%` 可能是更好的选择。但是你真的需要知道程序在错误时返回什么。某些程序会为特殊类型的成功返回某些非零代码。 (3认同)