我有一个在c#项目中运行一些命令的后构建事件。最后一个命令有时会导致ERRORLEVEL值不等于零,然后构建失败。
我想添加一行额外的命令来始终将ERRORLEVEL值设置为零。最方便的方法是什么?
我有一个在c#项目中运行一些命令的后构建事件。最后一个命令有时会导致ERRORLEVEL值不等于零,然后构建失败。
我想添加一行额外的命令来始终将ERRORLEVEL值设置为零。最方便的方法是什么?
如果你使用exit /b 0
,你可以在子批处理脚本中返回一个errorlevel 0
,而不会同时退出父进程。
看起来这个方法可行:
ver > nul
并非所有东西都能正常工作,为什么会出现这种情况也不是很清楚。例如,以下内容无法正常工作:
echo. > nul
cls > nul
Find.exe
、Findstr.exe
、Help.exe
、Subst.exe
、Wmic.exe
、Xcopy.exe
等。 - Kevin Fegan在预构建或后构建事件中,如果可执行文件的返回代码大于零,并且对可执行文件的调用不是预构建或后构建事件中的最后一行,则快速消除其声音并避免触发非零 errorlevel
检查的方法是在失败的行后面跟随一行明确返回零:
cmd /c "exit /b 0"
这基本上是前面提到的解决方案的通用组合,可适用于不仅仅是构建事件的最后一行。
<某个失败的命令> || cmd /c "exit /b 0"
来作为一行代码。 - Alyssa Haroldsencmd /c "exit /b 9009"
,但对于将其设置为0,这种方法似乎有些过度。使用内部命令 ver > nul
是否同样可以达到效果,并且比通过 cmd /c "exit /b 0"
加载另一个命令行窗口的开销更小? - Kevin Fegancmd /c“exit 0”
也可以正常工作。 - Ross Smith IIcd .
即使在Unix shell中也可以使用。type nul>nul
因为Process Monitor显示了对cd .
的QueryDirectory
调用。cd .
在Unix shell中还有另一个好处。如果之前已经打开过该目录,则它会恢复重新创建的工作目录。call;
有没有Windows命令可以查找文件是否正在使用?
:
https://www.dostips.com/forum/viewtopic.php?t=5542
如果UnderDevService服务未启动。NET STOP UnderDevService /Y
exit 0
我使用VERIFY
或VERIFY > nul
(...) || 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进行调用和返回是不够的。
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
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 ""
在查看了所有其他答案后,我决定找到最有效的重置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