将ERRORLEVEL设置为0


14

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

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

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


Answers:


14

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

最好的方法是使用

exit /b 0

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

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

VERIFY > nul

cmd /c "exit /b 0"

ver > nul     

2
几乎正确。您只需使用set "errorlevel="
dbenham 2013年

Windows为什么允许某人将系统变量重新定义为常规变量?这两个定义是否仍然存在,它的只是echo和其他此类命令现在都指向常规命令?因此程序仍然可以更新系统变量,只是无法通过命令提示符访问它?
user972276 2013年

1
“要么,要么使用命令为您重置错误级别,例如echo,findstr等。” echo命令不会重置错误级别的变量。
antant

就像其他人所说的那样,如果errorlevel 变量已由用户/批处理“手动”设置"set errorlevel=0",则该errorlevel变量将不再反映退出代码,但是您仍然可以使用来访问退出代码if errorlevel do something
凯文·费根

(1)一个更笼统的问题是“如何将ERRORLEVEL设置为某个任意值,例如42?”  cmd /c exit 42 似乎是最好的答案。(2)正如  dbenham所指出的,您不需要  /b或引号。
斯科特

12

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

set "errorlevel="

如果您想将错误级别强制为0,则可以使用以下完全不直观但非常有效的语法:(call )。呼叫后的空间至关重要。如果要将错误级别设置为1,可以使用(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%

8

我个人使用此:

cd .

即使在unix shell中也可以使用。


但是,这可能会更快一些:type nul>nul因为Process Monitor QueryDirectorycd .PS 上显示了调用:cd .在unix shell中还有另一个不错的副作用。如果在擦除之前已经打开了工作目录,它将在终端中恢复已创建的工作目录。
安德里

2

这是其他一些重置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 ""


0

这些也将起作用:(将错误级别设置为1)

方法1

color 00

方法二

echo A | find "B"

您还可以使用此设置错误级别1-26:

echo Your errorlevel<sup>th</sup> character between A-Z | choice /c:Enter A-Z here /n
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.