我有一个post-build事件,它为c#项目运行一些命令。最后一个命令有时会导致ERRORLEVEL值不等于零,然后构建失败。
我想追加一行额外的命令来始终将ERRORLEVEL值设置为零。最方便的方法是什么?
答案 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 Monitor
在QueryDirectory
cd .
次来电
<强> PS:强>
cd .
在unix shell中有另一个好的副作用。如果在擦除之前打开了它,它会在终端中恢复重新创建的工作目录。
答案 5 :(得分:6)
我使用VERIFY
或VERIFY > 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
我一直在用它来做驴年。