我有一个post-build事件,它为ac#project运行一些命令.最后一个命令有时会导致ERRORLEVEL值不等于零,然后构建失败.
我想附加一行额外的命令来始终将ERRORLEVEL值设置为零.最方便的方法是什么?
我有一个应用程序,只有从Windows命令提示符调用时才能正常工作.与输入/输出流有关.
所以我可以通过将它作为参数传递给cmd来从bash脚本中调用它.
cmd/c"badapp"
这很好 - 但偶尔badapp会因网络问题而失败 - 我得不到反馈.无论如何都要从bash脚本中检查ERRORLEVEl - 或者在运行bash脚本的终端上查看badapp的输出?
只是偶然发现了一个奇怪的事情,%ERRORLEVEL%想知道是否有人知道为什么以及是否有办法解决它.从本质上讲,似乎if语句中执行的命令不设置%ERRORLEVEL%变量.的ERRORLEVEL(如IF ERRORLEVEL 1,这是从不同的IF %ERRORLEVEL% EQU 1)检查似乎还在正常工作的,所以我可能可以解决它,但它仍然是很好能够打印错误水平.用于调试或其他.
@echo off
Set TESTVAR=1
tasklist | find /I "IsntRunning.exe" > NUL
echo OUTSIDE_IF %ERRORLEVEL%
ThisWillSetErrorLevelTo9009ieNotRecognizedCommand
tasklist | find /I "IsntRunning.exe" > NUL
echo OUTSIDE_IF %ERRORLEVEL%
ThisWillSetErrorLevelTo9009ieNotRecognizedCommand
IF %TESTVAR% EQU 1 (
Set ERRORLEVEL=
tasklist | find /I "IsntRunning.exe" > NUL
echo INSIDE_IF ERRORLEVEL %ERRORLEVEL%
IF ERRORLEVEL 1 (
echo INSIDE_IF2 ERRORLEVEL GREQ 1 %ERRORLEVEL%
)
IF ERRORLEVEL 2 (
echo INSIDE_IF2 ERRORLEVEL GREQ 2 …Run Code Online (Sandbox Code Playgroud) 有时我在cmd中运行命令,例如:
fc/b file1 file2
并希望看到来自fc的返回码.有一个简单的方法吗?
我有以下Windows批处理代码:
for %%i in (iidbms iigcc iigcd dmfacp dmfrcp rmcmd qwerty) do (
tasklist | findstr /i %%i
echo %errorlevel%
if %errorlevel% == 0 (echo %%i ok process found %errorlevel%)
if %errorlevel% == 1 (echo %%i no process found %errorlevel%)
)
Run Code Online (Sandbox Code Playgroud)
但它没有像我期望的那样起作用.
所有名称进程iidbms,iigcc,iigcd,dmfacp,dmfrcp,rmcmd都是真实的,并且找到了它们,而qwerty是一个发明的,不应该找到它,所以应该打印"no process found 1",但它不会,它总是打印0.
但我所注意到的是,如果我tasklist | findstr /i qwerty从dos提示符运行,就在有%errorlevel%= 1之后.
什么样的答案可能或更好?
在Windows批处理脚本中处理错误的常用方法是使用
if errorlevel 1 ...或等if %errorlevel% neq 0 ....通常,人们希望错误处理代码保留ERRORLEVEL.
我相信所有外部命令总是会导致ERRORLEVEL被设置为某个值,因此错误处理代码必须在执行外部命令之前在环境变量中保留ERRORLEVEL.
但内部命令怎么样?问题是,一些内部命令在成功时将ERRORLEVEL清除为0,而有些则没有.而且我找不到任何指定哪些命令做什么的文档.
所以问题是,哪些内部命令成功后将ERRORLEVEL清除为0?这不是关于返回的ERRORLEVEL代码的一般问题,而是严格关于成功结果的问题.
有些帖子如何将ERRORLEVEL重置为零的最简单方法是什么?和Windows批处理文件:.bat vs .cmd?给出部分答案.但我从未见过全面的清单.
注意: 多年来我一直很好奇.所以我最终决定进行一系列实验并得出一个明确的答案.我发布此问答来分享我发现的内容.
ERRORLEVEL是大多数cmd.exe命令在根据一系列条件结束更改时返回的值,因此知道命令返回的值是有助于编写更好的批处理文件的有用信息.所有外部.exe程序在结束时都会更改ERRORLEVEL(这是ExitProcess和TerminateProcess Win-32 API函数的固有机制),并且通常记录这些值,但内部 cmd.exe命令返回的值在其他地方没有完整记录.
此问题中出现具有部分ERRORLEVEL值的表,但仅适用于成功时设置ERRORLEVEL = 0的内部命令.我建议OP这样的问题修改它,以便也包括"不成功的命令"返回的值,但他拒绝并邀请我发布我自己的问题/答案,所以在这里!必须注意的是大于零的不同ERRORLEVEL并没有必然意味着该命令失败!有些命令以无错误结束并返回大于零的值以指示不同的"退出状态",包括内部命令(如SET /P).
为了更好地使用Batch .bat文件中的内置cmd.exe命令,我们需要知道它们返回的ERRORLEVEL值以及此管理中涉及的机制.所以问题是,哪个内部cmd.exe命令将ERRORLEVEL设置为任何值(包括零)?
我正在尝试使用该EXIT /B X命令链接一系列.bat文件以返回成功或失败,&&以及||有条件地运行下一个.bat(例如a.bat && b.bat).
无论我是打电话EXIT /B 0还是其他任何结束a.bat,a.bat && b.bat都会在之后拨打b.bat.我的理解是EXIT /B 0应该设定ERRORLEVEL=0,这是成功,所以&&应该继续.与此相对应的是,调用EXIT /B 1应该设置ERRORLEVEL=1哪个失败,所以&&应该停止.我在这里错过了什么?
琐碎的例子:
对于非批处理命令,按预期执行:
C:\> echo test|findstr test>NUL && echo yes
yes
C:\> echo test|findstr test>NUL || echo yes
C:\> echo test|findstr nope>NUL && echo yes
C:\> echo test|findstr nope>NUL || echo yes
yes
Run Code Online (Sandbox Code Playgroud)
使用EXIT /B始终将a.bat视为成功:
C:\> echo @EXIT /B 0 > …Run Code Online (Sandbox Code Playgroud) 我有一个单线程应用程序,如果出现问题,应将DOS错误级别设置为非零值.抛出RuntimeException或使用System.exit(非零)更好吗?我不需要堆栈跟踪,我不希望这个应用程序被扩展/重用.这两个选项有什么区别?
我们在Visual Studio 2010中有一个项目,它在后期构建事件中运行批处理文件.该批处理从Microsoft SDK调用signtool.exe来对二进制文件进行签名和时间戳.
然而,时间戳服务器(我们使用http://timestamp.verisign.com/scripts/timstamp.dll)由于某种原因往往不可靠,有时会失败.这导致构建失败.
我们实现了更高级的批处理脚本(基于此代码),拆分签名和时间戳,并允许重试时间戳操作(如果失败).
以下是批处理脚本(signfile.bat)的简化版本:
@echo off
REM sign the file...
signtool.exe /f Authenticode.pfx /p PASS %1
if %errorlevel% neq 0 exit /b %errorlevel%
set timestamp_server=http://timestamp.verisign.com/scripts/timstamp.dll
for /L %%a in (1,1,10) do (
REM try to timestamp the file...
signtool.exe timestamp /t %timestamp_server% %1
if errorlevel 0 if not errorlevel 1 GOTO succeeded
REM wait 2 seconds...
ping -n 2 127.0.0.1 > nul
)
REM return an error code...
echo signfile.bat exit code is …Run Code Online (Sandbox Code Playgroud) build-process code-signing visual-studio-2010 errorlevel timestamping
errorlevel ×10
batch-file ×6
cmd ×6
windows ×4
bash ×1
code-signing ×1
exit ×1
java ×1
return-code ×1
timestamping ×1