很抱歉,你的尝试完全没有接近。 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在问题中链接的答案时,我编辑了我的答案以明确清除任何用户定义的errorlevel值。用户定义的errorlevel可能会掩盖我们尝试访问的动态值。但是这仅适用于扩展名为.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%。因此,可以说没有一种绝对可靠的方法来通过错误级别检查错误。最可靠的方法(但仍不完美)是使用||
运算符。