我们有一个file1.cmd,调用file2.cmd调用file3.cmd。
file3.cmd返回失败:exit / b 1
但是在file2.cmd中,我们似乎“丢失”了这个失败代码。 %ERRORLEVEL%变量被列为0而不是1.
有什么想法吗?
答案 0 :(得分:1)
可以找到的常见问题:
将errorlevel变量设置为值
set errorlevel=0
echo test | find "x" > nul 2>nul
echo %errorlevel%
这里将设置errorlevel(find
操作失败),但回显到控制台的值为0. errorlevel
是一个动态变量,并设置一个值阻止访问动态价值。不应使用errorlevel
命令设置set
值。
如果需要设置errorlevel,你可以
exit n
或exit /b n
cmd /c exit n
在n
两种情况下都要在errorlevel中设置数值
要清除错误级别,您可以使用:ver>nul
可变扩展
if 1==1 (
echo test | find "x" > nul 2>nul
if %errorlevel%==1 echo failed
)
当批处理解析器到达一行或一行(括号中的行)时,它会替换变量上的所有读取操作,其中之前的值执行行/块。因此,如果变量在行/块内更改其值,则无法从同一行/块内检索新值。读操作不存在,它被替换为初始值。
可以启用延迟扩展,允许将语法从%var%
更改为!var!
,向解析器指示必须延迟读取操作直到命令执行
setlocal enabledelayedexpansion
if 1==1 (
echo test | find "x" > nul 2>nul
if !errorlevel!==1 echo failed
)
但对于前两种情况中的任何一种情况,都有另一种选择。批处理语言包括用于测试不受指定值或变量扩展
影响的错误级别的构造if errorlevel n .....
对于任何大于或等于n
的错误级别,此构造将被评估为true。因此,在使用此构造并测试不同的错误级别时,有必要从更高到更低的值测试errorlevel
if errorlevel 3 (
....
) else if errorlevel 2 (
....
) else if errorlevel 1 (
....
) else (
....
)
如果唯一检查是否设置了errorlevel,则可以使用条件执行来删除此构造
command && ( .... ) || ( .... )
在未设置errorlevel时执行&&
之后的命令,以及在设置errorlevel时执行||
之后的命令