将ERRORLEVEL重置为零的最简单方法是什么?
我有一个生成后事件,为ac#项目运行一些命令。 最后一个命令有时会导致ERRORLEVEL值不等于零,然后构build失败。
我想追加一个额外的命令行来始终将ERRORLEVEL值设置为零。 什么是最方便的方法呢?
如果使用exit /b 0
,则可以从子批处理脚本中返回错误errorlevel 0
,而不会退出父级。
似乎做的伎俩:
ver > nul
并非一切正常,不清楚为什么。 例如,下面不要:
echo. > nul cls > nul
在生成前或生成后事件中,如果可执行文件的返回码大于零,并且对可执行文件的调用不是生成前或生成后事件的最后一行,可以使用快捷方式将其静音并避免触发一个非零错误errorlevel
的检查是跟随失败行显式返回零:
cmd /c "exit /b 0"
这实质上是前面提到的解决scheme的通用组合,它们不仅可以用于构build前或构build后事件的最后一行。
我发现“0号出口”看起来是解决这个问题的好方法。
用法示例:
NET STOP UnderDevService / Y
退出0
如果UnderDevService服务未启动。
我使用VERIFY
或VERIFY > nul
如果这是一个像“后生成事件”等片段,那么你会很好追加:
(...) || ver > nul
在最后一个命令的末尾。
另外
cmd /c "exit /b 0"
是非常干净和非惯用的 – 一个知道Windows shell的读者会知道发生了什么,你的意图是什么。
但是,如果您使用的是批处理脚本,则可能需要使用subrotine,这与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是不够的。
在每个可能失败的命令之后添加>nul
,这似乎可以防止构build失败。
您仍然可以通过检查%errorlevel%
来检查命令的结果。
例如:
findstr "foo" c:\temp.txt>nul & if %errorlevel% EQU 0 (echo found it) else (echo didn't find it)
我正在使用这个:
ping localhost -n 1> null
我个人使用这个:
cd .
即使在unix shell中也可以工作。
但是,这个可能会快一点:
type nul>nul
因为Process Monitor
在cd .
上显示QueryDirectory
调用cd .
我总是用过;
set ERRORLEVEL=0
我一直用它驴的年。