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

use*_*319 66 windows cmd batch-file errorlevel

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

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

akf*_*akf 64

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

  • 在所有提议的解决方案中,这可能是最好的解决方案.我打算把这行放到*resetErrorlevel.bat*脚本中.总而言之,人们必须尽可能地做一些像清除脚本错误级别那样微不足道的事实,这更加证明了Windows批处理编程的发明者应该被追捕并严厉惩罚.;) (5认同)

Jas*_*aty 51

似乎可以做到这一点:

ver > nul
Run Code Online (Sandbox Code Playgroud)

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

echo. > nul
cls > nul
Run Code Online (Sandbox Code Playgroud)

  • 我认为为什么"echo"和"cls"不起作用的原因是因为它们是shell内置命令,而不是真正的程序. (12认同)
  • 如果在命令shell中运行帮助,您将看到ver也是内置命令 (5认同)
  • 我会给你的,但ver.exe在哪里? (2认同)
  • @BaiyanHuang - 我几乎肯定 `"ver"` 是一个内部命令,但是你怎么能从 `"help"` 中分辨出来?`"help"` 中列出的许多命令都是“外部”命令,例如:`Find.exe`、`Findstr.exe`、`Help.exe`、`Subst.exe`、`Wmic.exe`、`Xcopy .exe`, ... (2认同)

Jef*_*rey 29

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

cmd /c "exit /b 0"
Run Code Online (Sandbox Code Playgroud)

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

  • 更奇特的是:你可以使用`<some failing command> || cmd/c"exit/b 0"`作为一个衬垫. (4认同)
  • `/b` 不是必需的,所以 `cmd /c “exit 0”` 也能正常工作。 (2认同)

use*_*319 17

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

用法示例:

NET STOP UnderDevService/Y.

退出0

如果未启动UnderDevService服务.

  • 如果您还想从命令行运行该批处理文件,则不会,因为退出0将关闭窗口.cmd/c"exit/b 0"如下所示更为精彩 (7认同)

And*_*dry 10

我个人用这个:

cd .

即使在unix shell中也能工作.

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

type nul>nul

因为Process Monitor节目QueryDirectory要求cd .

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


ixe*_*013 7

我用VERIFYVERIFY > nul


Tom*_*dor 6

如果这是“构建后事件”等片段,那么您可以附加:

(...) || ver > nul
Run Code Online (Sandbox Code Playgroud)

在最后一个命令的末尾。

或者

cmd /c "exit /b 0"
Run Code Online (Sandbox Code Playgroud)

非常干净且不惯用语——了解 Windows shell 的读者会知道发生了什么,以及您的意图是什么。

但是,如果您使用的是批处理脚本,则可能需要使用子程序,它是 akf 答案中“子批处理脚本”的轻量级等效项。

有一个子程序:

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

然后只是

call :reset_error
Run Code Online (Sandbox Code Playgroud)

无论你需要它。

这是一个完整的例子:

@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
Run Code Online (Sandbox Code Playgroud)

哪些输出:

After :raise_error ERRORLEVEL = 1
After :empty ERRORLEVEL = 1
After :reset_error ERRORLEVEL = 0
Run Code Online (Sandbox Code Playgroud)

如您所见 - 仅通过 goto:eof 调用和返回是不够的。