如何最简单地将ERRORLEVEL重置为零?

90

我有一个在c#项目中运行一些命令的后构建事件。最后一个命令有时会导致ERRORLEVEL值不等于零,然后构建失败。

我想添加一行额外的命令来始终将ERRORLEVEL值设置为零。最方便的方法是什么?


1
构建并没有真正失败,只是IDE看起来像失败了。 - Dykam
12
我意识到这是一篇相当老的帖子...... 我成功地通过在最后一个命令之后发出“type nul”命令来将错误级别重置为0。只是觉得可能会有用。 - Arun
14个回答

77

如果你使用exit /b 0,你可以在子批处理脚本中返回一个errorlevel 0,而不会同时退出父进程。


7
在所有提出的解决方案中,这可能是最好的一个。我将把这行代码添加到一个名为 resetErrorlevel.bat 的脚本中。总之,要想清除脚本的错误级别竟然要费这么大的周折,这再次证明了Windows批处理编程的发明者应该被追究并受到严厉的惩罚。 ;) - antred

59

看起来这个方法可行:

ver > nul

并非所有东西都能正常工作,为什么会出现这种情况也不是很清楚。例如,以下内容无法正常工作:

echo. > nul
cls > nul

14
我认为 "echo" 和 "cls" 无法运行的原因是它们是 Shell 内置命令,而不是真正的程序。 - user95319
3
我明白你的意思,但是ver.exe在哪里? - Jason Kresowaty
我也找不到“ver.exe”或“ver.com”。我不知道该如何解释。 - user95319
1
在批处理命令行中,"ver" 返回 MS Windows 版本,例如 "Microsoft Windows [Version 6.1.7601]"。 - AnneTheAgile
6
如果你在命令提示符中运行help命令,你会发现ver也是一个内置命令。 - Baiyan Huang
2
@BaiyanHuang - 我几乎可以确定“ver”是一个内部命令,但你怎么能从“help”中知道呢?在“help”中列出的许多命令都是“外部”命令,例如:Find.exeFindstr.exeHelp.exeSubst.exeWmic.exeXcopy.exe等。 - Kevin Fegan

35

在预构建或后构建事件中,如果可执行文件的返回代码大于零,并且对可执行文件的调用不是预构建或后构建事件中的最后一行,则快速消除其声音并避免触发非零 errorlevel 检查的方法是在失败的行后面跟随一行明确返回零:

cmd /c "exit /b 0"

这基本上是前面提到的解决方案的通用组合,可适用于不仅仅是构建事件的最后一行。


谢谢,这对我有用。上面听起来更简单的建议“exit 0”不够好,因为我希望在重置错误级别后继续执行操作,而不是退出。 - madoki
4
更加高级的做法是,你可以使用<某个失败的命令> || cmd /c "exit /b 0"来作为一行代码。 - Alyssa Haroldsen
我喜欢使用以下方法来设置任意的errorlevel:cmd /c "exit /b 9009",但对于将其设置为0,这种方法似乎有些过度。使用内部命令 ver > nul 是否同样可以达到效果,并且比通过 cmd /c "exit /b 0" 加载另一个命令行窗口的开销更小? - Kevin Fegan
2
“/b”不是必需的,所以cmd /c“exit 0”也可以正常工作。 - Ross Smith II
我喜欢这个,它能胜任工作。谢谢。有趣的是,我正在追踪一些文件,我的错误级别一直在变成1,最后我发现提示用户输入(set /p id="enter id")会将错误级别更改为1!... 我已经填好了b。 - A Khudairy

23
我个人使用以下命令: cd . 即使在Unix shell中也可以使用。
但是,这个命令可能会更快一些: type nul>nul 因为Process Monitor显示了对cd .QueryDirectory调用。
PS:cd . 在Unix shell中还有另一个好处。如果之前已经打开过该目录,则它会恢复重新创建的工作目录。
更新:
以下命令速度更快:
call;

有没有Windows命令可以查找文件是否正在使用?:
https://www.dostips.com/forum/viewtopic.php?t=5542


18
我发现"exit 0"看起来是解决这个问题的好方法。
使用示例:

NET STOP UnderDevService /Y

exit 0

如果UnderDevService服务未启动。

14
如果您还想从命令行运行批处理文件,则不能使用“exit 0”,因为它会关闭窗口。建议改用下面提供的“cmd /c 'exit /b 0'”,这样更加安全。 - madoki

9

我使用VERIFYVERIFY > nul


6
如果这是类似于“Post-build Event”等的片段,那么你只需要追加以下内容即可:
(...) || ver > nul

在最后一个命令的末尾。
另外,
cmd /c "exit /b 0"

这段内容非常干净,不带习惯用语。如果读者熟悉Windows shell,将会明白发生了什么以及你的意图。

然而,如果你在批处理脚本中,可能需要使用子程序,它们是akf答案中“子批处理脚本”的轻量级等效物。

有一个子程序:

:reset_error
exit /b 0

然后只需执行以下操作
call :reset_error

无论您在何处需要它。

这里是一个完整的示例:

@echo off
rem *** main ***

call :raise_error
echo After :raise_error ERRORLEVEL = %ERRORLEVEL%

call :empty
echo After :empty ERRORLEVEL = %ERRORLEVEL%

call :reset_error
echo After :reset_error ERRORLEVEL = %ERRORLEVEL%

:: this is needed at the end of the main body of the script
goto:eof

rem *** subroutines ***

:empty
goto:eof

:raise_error
exit /b 1

:reset_error
exit /b 0

这将产生以下输出:

After :raise_error ERRORLEVEL = 1
After :empty ERRORLEVEL = 1
After :reset_error ERRORLEVEL = 0

仅仅通过使用goto:eof进行调用和返回是不够的。


4
以下内容适用于具有 cmd.exe 的现代 Windows (基于NT的) 系统:
rem /* This clears `ErrorLevel`; the SPACE can actually be replaced by an
rem    arbitrary sequence of SPACE, TAB, `,`, `;`, `=`, NBSP, VTAB, FF: */
(call )

在IT技术相关中,SPACE(或者说,一个或多个标准令牌分隔符序列,包括 SPACE (代码是 0x20 ), TAB (代码是 0x09 ),,;=NBSP (代码是 0xFF ),VTAB (代码是0x0B)和FF (代码是0x0C))是必须的;如果省略了它,ErrorLevel 就会被设定:

rem // This sets `ErrorLevel` to `1`:
(call)

DosTips.com上有一个很好的讨论,介绍了这种技术。


这里是另一种方法,但需要访问文件系统,因此可能会慢些:

dir > nul

rem /* Perhaps this is a little faster as a specific file is given rather 
rem    than just the current directory (`.` implicitly) like above: */
dir /B "%ComSpec%" > nul

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

keyb > nul

为了完整起见,这将把ErrorLevel状态设置为1,对于Windows和MS-DOS都有效:

< nul find ""

1

在查看了所有其他答案后,我决定找到最有效的重置ERRORLEVEL的方法。我编写了一个快速脚本来记录执行每个操作所需的时间:

"cmd /c "exit /b 0"", "cd .", "ver", "type nul", and "VERIFY"

回复内容存在敏感词^**$} 进行检查后,我发现它只能真正接受 cd .cmd /c "exit /b 0" -- 我做错了什么吗?

我建议使用cd .或者type nul,因为它们都不会在控制台输出中留下任何痕迹,也不会降低速度。
是的,我很无聊。

是的,cmd /C exit [/B] 0 应该是最慢的,因为会打开和关闭一个新的 cmd.exe 实例;其他命令都是内部命令,所以没有文件系统访问来查找可执行文件... - aschipfl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接