将ERRORLEVEL重置为零的最简单方法是什么?

时间:2009-07-11 13:31:37

标签: windows batch-file cmd errorlevel

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

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

13 个答案:

答案 0 :(得分:61)

如果您使用exit /b 0,则可以从子批处理脚本中返回errorlevel 0,而不退出父级。

答案 1 :(得分:45)

似乎可以做到这一点:

ver > nul

并非一切正常,而且不清楚为什么。例如,以下内容不会:

echo. > nul
cls > nul

答案 2 :(得分:28)

在构建前或构建后事件中,如果可执行文件的返回代码大于零,并且对可执行文件的调用不是构建前或构建后事件的最后一行,则快速静音它并避免触发检查非零errorlevel是跟随失败的行,显示返回零的行:

cmd /c "exit /b 0"

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

答案 3 :(得分:17)

我发现“退出0”看起来是处理这个问题的好方法。

用法示例:

  

NET STOP UnderDevService / Y

     

退出0

如果未启动UnderDevService服务。

答案 4 :(得分:8)

我个人用这个:

cd .

即使在unix shell中也能正常工作。

但是,这个可能会快一点:

type nul>nul

由于Process MonitorQueryDirectory

上显示cd .次来电

<强> PS: cd .在unix shell中有另一个好的副作用。如果在擦除之前打开了它,它会在终端中恢复重新创建的工作目录。

答案 5 :(得分:6)

我使用VERIFYVERIFY > nul

答案 6 :(得分:2)

如果这是“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是不够的。

答案 7 :(得分:1)

以下内容在具有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 )

SPACE (或更准确地说,是一个或多个标准令牌分隔符的任意序列,它们是 SPACE (代码0x20), TAB (代码0x09),,;= NBSP (代码0xFF),< kbd> 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

答案 8 :(得分:0)

在每个可能失败的命令之后添加>nul - 这似乎可以防止构建失败。

您仍然可以通过检查%errorlevel%

来检查命令的结果

例如:

findstr "foo" c:\temp.txt>nul & if %errorlevel% EQU 0 (echo found it) else (echo didn't find it)

答案 9 :(得分:0)

还有其他一些重置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 ""

答案 10 :(得分:0)

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

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

这是输出:

cmd / v:on / c set ^“ q = ^” ^“&timeit.cmd” cmd / c ^!q ^!exit / b 0 ^!q ^!“” cd。“” ver“”输入nul“” VERIFY“

cmd / c“退出/ b 0”花费了0:0:0.02(总计0.02s)

cd。花了0:0:0.00(共0.00秒)

Microsoft Windows [版本10.0.18362.836]

花费了0:0:0.00(总计0.00秒)

nul类型花费了0:0:0.00(总计0.00秒)

验证已关闭。 验证时间为0:0:0.00(总计0.00秒)


这花了0:0:0.06(总共0.06s)

在Powershell中使用Measure-Command {command}进行审核后,我发现它只真正接受cd .cmd /c "exit /b 0" -我做错了吗?

我建议使用cd .type nul,因为它们既不会占用控制台输出的空间,也不会降低速度。

是的,我很无聊

答案 11 :(得分:-1)

我用这个:

ping localhost -n 1&gt; null

答案 12 :(得分:-4)

我总是刚刚使用过;

set ERRORLEVEL=0

我一直在用它来做驴年。