将 ERRORLEVEL 设置为 0

use*_*276 16 windows command-line batch-file windows-error-reporting

我有一个批处理文件,它是安装程序的包装器。该批处理文件检查安装程序返回的错误级别并进行相应的打印。

我注意到,如果我set ERRORLEVEL=0在启动批处理文件(在同一命令窗口/环境中)之前在命令提示符下执行,安装程序永远不会弄乱错误级别,我的批处理脚本总是返回通过。我假设%ERRORLEVEL%是一个由 Windows 定义的变量,专门用于打印程序和脚本中的错误,并且在批处理文件或其他东西中使用该变量将“自担风险”,因为它可以随时更改另一个过程。

从表面上看,当我在给定环境中设置 errorlevel 时,它会以某种方式终止使用 errorlevel 作为退出代码的持有者。有人知道为什么是这样吗?对我来说,这只是奇怪的意外行为。任何有关该主题的信息将不胜感激!

Twi*_*rin 16

您正在将系统变量重新定义为常规变量。执行此操作时,系统将不会使用它,直到命令会话关闭。

最好的方法是使用

exit /b 0
Run Code Online (Sandbox Code Playgroud)

在另一个批处理文件中并从您的主脚本中调用它。数字 0 是您想要的errorlevel。要么使用该命令,要么使用errorlevel为您重置的命令,例如 echo、findstr 等。

例如,以下命令将ERRORLEVEL在您的批处理文件中全部设置为 0:

VERIFY > nul

cmd /c "exit /b 0"

ver > nul     
Run Code Online (Sandbox Code Playgroud)

  • 几乎正确。您可以通过使用 `set "errorlevel="` 取消定义任何用户定义的值来让“系统”使用动态 ERRORLEVEL (2认同)

dbe*_*ham 13

您永远不应该将自己的值分配给动态系统变量,如 ERRORLEVEL、PATH、CD、DATE、TIME 等。这样做会阻止代码看到动态值。您可以通过简单地取消定义用户定义的值来恢复动态值。例如:

set "errorlevel="
Run Code Online (Sandbox Code Playgroud)

如果您想强制错误级别为 0,那么您可以使用这种完全不直观但非常有效的语法:(call ). 通话后的空间至关重要。如果要将错误级别设置为 1,可以使用(call). 调用后没有任何空间是至关重要的。

(call)
echo %errorlevel%
(call )
echo %errorlevel%
Run Code Online (Sandbox Code Playgroud)

设置错误级别的更直观但不太方便的方法是在批处理文件中使用专用子例程:

call :setErr 1
echo %errorlevel%
call :setErr 0
echo %errorlevel%
exit /b

:setErr
exit /b %1
Run Code Online (Sandbox Code Playgroud)

或者,如果在命令行上,您可以使用

cmd /c exit 1
echo %errorlevel%
cmd /c exit 0
echo %errorlevel%
Run Code Online (Sandbox Code Playgroud)


小智 8

我个人使用这个:

cd .

即使在 unix shell 中也能工作。


小智 7

这是我发现的唯一有效的方法。

call (exit /b 0)
Run Code Online (Sandbox Code Playgroud)

在使用检测 ERRORLEVEL 的第三方脚本的脚本中需要它,但没有正确重置其自身的错误级别。