我有一个批处理文件,它是安装程序的包装器。此批处理文件检查安装程序返回的错误级别并进行相应的打印。
我注意到,如果我set ERRORLEVEL=0
在启动批处理文件之前在命令提示符中执行(在同一个命令窗口/环境中),安装程序永远不会弄乱错误级别,并且我的批处理脚本始终返回已通过。我认为%ERRORLEVEL%
是 Windows 定义的变量,专门用于打印程序和脚本中的错误,并且在批处理文件或其他文件中使用该变量将“风险自负”,因为它可能随时被另一个进程更改。
从表面上看,当我在给定环境中设置 errorlevel 时,它会以某种方式终止使用 errorlevel 作为退出代码的持有者。有人知道这是为什么吗?对我来说,这只是奇怪的意外行为。任何有关此主题的信息都将不胜感激!
答案1
您正在将系统变量重新定义为常规变量。执行此操作时,系统将不会使用它,直到命令会话关闭。
最好的方法是使用
exit /b 0
在另一个批处理文件中,并从主脚本中调用它。其中数字 0 是您想要的errorlevel
。或者使用为您重置的命令errorlevel
,例如 echo、findstr 等。
例如,以下命令ERRORLEVEL
在您的批处理文件中将全部设置为 0:
VERIFY > nul
cmd /c "exit /b 0"
ver > nul
答案2
您永远不应将自己的值分配给动态系统变量(如 ERRORLEVEL、PATH、CD、DATE、TIME 等)。这样做会阻止代码看到动态值。您只需取消定义用户定义的值即可恢复动态值。例如:
set "errorlevel="
如果要强制将错误级别设置为 0,则可以使用这种完全不直观但非常有效的语法:(call )
。call 后的空格至关重要。如果要将错误级别设置为 1,可以使用(call)
。call 后不能有任何空格,这一点至关重要。
(call)
echo %errorlevel%
(call )
echo %errorlevel%
设置错误级别的一种更直观但不太方便的方法是使用批处理文件中的专用子程序:
call :setErr 1
echo %errorlevel%
call :setErr 0
echo %errorlevel%
exit /b
:setErr
exit /b %1
或者如果在命令行上,你可以使用
cmd /c exit 1
echo %errorlevel%
cmd /c exit 0
echo %errorlevel%
答案3
我个人使用这个:
cd .
即使在 unix shell 中也能工作。
答案4
这里有一些其他的重置状态的方法ErrorLevel
,甚至可以在 MS-DOS 中使用(至少对于 6.22 版本):
more < nul > nul
rem // The `> nul` part can be omitted in Windows but is needed in MS-DOS to avoid a line-break to be returned:
sort < nul > nul
以下方法仅适用于 MS-DOS:
command /? > nul
fc nul nul > nul
为了完整起见,将状态设置ErrorLevel
为1
,对 Windows 和 MS-DOS 都有效:
< nul find ""