windows - 在 Windows 批处理文件中检查非零(错误)返回码的万无一失的方法

标签 windows batch-file

介绍

有很多关于处理批处理文件中的返回码的建议(使用 ERROLEVEL 机制),例如

一些建议是执行 if errorlevel 1 goto somethingbad,而其他建议使用 %ERRORLEVEL% 变量并使用 ==EQULSS 等。 中似乎存在问题code>IF 语句等,因此鼓励延迟扩展,但它似乎有其自身的怪癖。

问题

什么是万无一失(即健壮,因此它可以在几乎任何具有几乎任何返回代码的系统上工作)的方法来知道是否已返回错误(非零)代码?

我的尝试

对于基本用法,以下似乎可以捕获任何非零返回码:

if not errorlevel 0 (
    echo error level was nonzero
)

最佳答案

抱歉,您的尝试还差得远。 if not errorlevel 0 仅当 errorlevel 为负时才为真。

如果你知道errorlevel永远不会是负数,那么

if errorlevel 1 (echo error level is greater than 0)

如果您必须允许负错误级别,并且不在带括号的代码块内,则

set "errorlevel=1"
set "errorlevel="
if %errorlevel% neq 0 (echo error level is non-zero)

注意 - 在阅读 Joey 对问题中的链接答案的评论后,我编辑了我的答案以明确清除任何用户定义的错误级别值。用户定义的错误级别可以掩盖我们试图访问的动态值。但这仅在您的脚本具有 .bat 扩展名时才有效。如果您设置或清除变量,带有 .cmd 扩展名的脚本会将您的 ERRORLEVEL 设置为 0!更糟糕的是,如果您试图取消定义一个不存在的变量,XP 会将 ERRORLEVEL 设置为 1。这就是为什么我在尝试清除它之前首先明确定义一个 ERRORLEVEL 变量!

如果您在带括号的代码块内,则必须使用延迟扩展来获取当前值

setlocal enableDelayedExpansion
(
  SomeCommandThatMightGenerateAnError
  set "errorlevel=1"
  set "errorlevel="
  if !errorlevel! neq 0 (echo error level is non-zero)
)

但有时您不想启用延迟扩展。如果您想在执行命令后立即检查错误级别,则不会丢失所有内容。

(
  SomeCommandThatMightGenerateAnError && (echo Success, no error) || (echo There was an error)
)

如果您绝对必须检查动态 ERRORLEVEL 值而不在带括号的 block 中使用延迟扩展,则以下方法有效。但是它在两个地方有错误处理代码。

(
  SomeCommandThatMightGenerateAnError
  if errorlevel 1 (echo errorlevel is non-zero) else if not errorlevel 0 (echo errorlevel is non-zero)
)


终于,这是对非零错误级别的“最终”测试,它应该在任何情况下都有效:-)

(
  SomeCommandThatMightGenerateAnError
  set foundErr=1
  if errorlevel 0 if not errorlevel 1 set "foundErr="
  if defined foundErr echo errorlevel is non-zero
)

为了方便使用,它甚至可以转换成宏:

set "ifErr=set foundErr=1&(if errorlevel 0 if not errorlevel 1 set foundErr=)&if defined foundErr"
(
  SomeCommandThatMightGenerateAnError
  %ifErr% echo errorlevel is non-zero
)

宏支持圆括号和 ELSE 就好了:

%ifErr% (
  echo errorlevel is non-zero
) else (
  echo errorlevel is zero
)


最后一期:

输入和/或输出的重定向可能由于多种原因而失败。但是重定向错误不会设置错误级别,除非使用|| 运算符。参见 File redirection in Windows and %errorlevel%了解更多信息。因此可以争辩说,不存在通过错误级别检查错误的万无一失的方法。最可靠的方法(但仍然不是万无一失的)是 || 运算符。

关于windows - 在 Windows 批处理文件中检查非零(错误)返回码的万无一失的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10935693/

相关文章:

c++ - 多线程全局对象访问

windows - 服务器端 FTP 批处理脚本

linux - 我正在寻找将我的 MS-DOS .bat 文件转换为等效的 linux .sh 文件

windows - 如果超过 10 个,将删除最新文件夹的批处理文件

windows - Windows 批处理文件中的可变行为

python - 如何在 Windows 上捕获并打印来自 Internet 的数据包?

c++ - 异常处理不适用于 Windows 上的 Qt

windows - 使用批处理脚本在 Windows 中添加注册表项,并在数据中添加引号

batch-file - CMD:文件任务,打开目录并选择文件

mysql - 带有 MySQL 的可移植 SpringMVC 应用程序