抱歉,您的尝试还没有接近。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 值而不使用括号内的延迟扩展,那么以下工作。但它在两个地方都有错误处理代码。
(
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
)
最后一期:
输入和/或输出的重定向可能由于多种原因而失败。但是除非使用了操作符,否则重定向错误不会||
设置错误级别。有关详细信息,请参阅Windows 中的文件重定向和 %errorlevel%。因此有人可以争辩说,不存在一种通过错误级别检查错误的万无一失的方法。最可靠的方法(但仍然不是绝对可靠的)是||
运算符。