Pat*_*Pat 18 windows batch-file
有很多建议用于处理批处理文件中的返回代码(使用ERROLEVEL机制),例如
有些建议是做if errorlevel 1 goto somethingbad,而其他人建议使用
%ERRORLEVEL%变量和使用==,EQU,LSS等有似乎内的问题IF陈述和这样的,所以后来delayedexpansion鼓励,但它似乎来与自己的怪癖.
什么是万无一失(即健壮,所以它几乎可以在任何具有几乎任何返回码的系统上工作)的方式来知道是否返回了一个坏的(非零)代码?
对于基本用法,以下似乎可以正常捕获任何非零返回代码:
if not errorlevel 0 (
echo error level was nonzero
)
Run Code Online (Sandbox Code Playgroud)
dbe*_*ham 41
对不起,您的尝试甚至都没有结束.if not errorlevel 0仅当errorlevel为负数时才为真.
如果你知道errorlevel永远不会是负数,那么
if errorlevel 1 (echo error level is greater than 0)
Run Code Online (Sandbox Code Playgroud)
如果必须允许负的错误级别,并且不在括号内的代码块中,那么
set "errorlevel=1"
set "errorlevel="
if %errorlevel% neq 0 (echo error level is non-zero)
Run Code Online (Sandbox Code Playgroud)
注意 - 我在回答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)
)
Run Code Online (Sandbox Code Playgroud)
但有时您不希望启用延迟扩展.如果要在执行命令后立即检查错误级别,则不会丢失所有内容.
(
SomeCommandThatMightGenerateAnError && (echo Success, no error) || (echo There was an error)
)
Run Code Online (Sandbox Code Playgroud)
如果绝对必须检查动态ERRORLEVEL值而不使用带括号的块中的延迟扩展,则以下方法有效.但它在两个地方有错误处理代码.
(
SomeCommandThatMightGenerateAnError
if errorlevel 1 (echo errorlevel is non-zero) else if not errorlevel 0 (echo errorlevel is non-zero)
)
Run Code Online (Sandbox Code Playgroud)
在这里,最后,是非零错误的"终极"测试,应该在任何情况下都可以工作:-)
(
SomeCommandThatMightGenerateAnError
set foundErr=1
if errorlevel 0 if not errorlevel 1 set "foundErr="
if defined foundErr echo errorlevel is non-zero
)
Run Code Online (Sandbox Code Playgroud)
它甚至可以转换为宏以便于使用:
set "ifErr=set foundErr=1&(if errorlevel 0 if not errorlevel 1 set foundErr=)&if defined foundErr"
(
SomeCommandThatMightGenerateAnError
%ifErr% echo errorlevel is non-zero
)
Run Code Online (Sandbox Code Playgroud)
宏支持括号和ELSE就好了:
%ifErr% (
echo errorlevel is non-zero
) else (
echo errorlevel is zero
)
Run Code Online (Sandbox Code Playgroud)
最后一个问题:
输入和/或输出的重定向可能由于多种原因而失败.但是,除非使用运算符,否则重定向错误不会设置errorlevel ||.有关详细信息,请参阅Windows中的文件重定向和%errorlevel%.因此,人们可以争辩说,不存在通过错误级别检查错误的万无一失的方法.最可靠的方法(但仍然不是绝对可靠的)是||运营商.
| 归档时间: |
|
| 查看次数: |
28005 次 |
| 最近记录: |