DOS批处理脚本返回代码未返回给调用者

时间:2015-01-30 19:42:35

标签: batch-file cmd error-handling errorlevel

我们有一个file1.cmd,调用file2.cmd调用file3.cmd。

file3.cmd返回失败:exit / b 1

但是在file2.cmd中,我们似乎“丢失”了这个失败代码。 %ERRORLEVEL%变量被列为0而不是1.

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

可以找到的常见问题:

将errorlevel变量设置为值

set errorlevel=0
echo test | find "x" > nul 2>nul
echo %errorlevel%

这里将设置errorlevel(find操作失败),但回显到控制台的值为0. errorlevel是一个动态变量,并设置一个值阻止访问动态价值。不应使用errorlevel命令设置set值。

如果需要设置errorlevel,你可以

  • 离开正在运行的批次时:exit nexit /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时执行||之后的命令