检查批处理文件中的命令是否成功执行

66

如何在批处理文件中检查命令是否存在

start "" javaw -jar %~p0/example.jar

执行成功还是产生了错误?

我想使用if/else语句将这些信息输出。

6个回答

89

很可能这不能与start一起使用,因为它会启动一个新窗口,但是为了回答您的问题:

如果命令返回错误级别,您可以通过以下方式进行检查:

按照具体错误级别

commandhere
if %errorlevel%==131 echo do something

如果发生任何错误

commandhere || echo what to do if error level ISN'T 0

如果没有错误

commandhere && echo what to do if error level IS 0

如果没有返回错误级别,但是有输出,你可以将其捕获在一个变量中,并通过输出来确定。例如(请注意,令牌和分隔符只是示例,可能会在任何特殊字符下失败)

通过解析完整的输出

for /f "tokens=* delims=" %%a in ('somecommand') do set output=%%a
if %output%==whateveritwouldsayinerror echo error

您可以只在输出中查找单个短语,例如单词 Error

通过检查字符串

commandhere | find "Error" || echo There was no error!
commandhere | find "Error" && echo There was an error!

你甚至可以混合在一起使用(只需记得在 for 语句中用 ^| 转义 |

希望这可以帮到你。


如何检查不等? - Prem
这应该是被认可的答案。 - Marco Sulla

52

你可以使用

if errorlevel 1 echo Unsuccessful

在某些情况下,这取决于上一个命令是否返回正确的退出代码。即使存在异常情况,如果你的程序正常返回,你也无法知道是否有任何问题。

注意使用像Robocopy这样的程序需要更加细致的方法,因为从中返回的错误级别是一个包含不止布尔信息的位掩码,而实际的成功代码是3(据我所知)。


4
这是正确的答案,因为它比检查%errorlevel%更明确,因为ERRORLEVEL不等于%ERRORLEVEL% - sschuberth
1
@TomášZato:它将触发任何正退出码。 - Joey
@sschuberth 如果 errorlevel 是 -1 呢? - Marco Sulla
@marco-sulla,你怎么看? - sschuberth
实际上,我刚刚验证了在Windows上errorlevel是有符号的,并且exit /b -1不会导致errorlevel变为255(就像在DOS时代一样),而是-1。无论如何,这个答案的重点是使用errorlevel而不是%errorlevel%,比较只是我的一个例子。 - sschuberth
显示剩余2条评论

19

大多数命令/程序在成功时返回0,而在发生错误时返回称为 errorlevel 的其他值。

例如,您可以通过以下方式检查批处理中的错误:

call <THE_COMMAND_HERE>
if %ERRORLEVEL% == 0 goto :next
echo "Errors encountered during execution.  Exited with status: %errorlevel%"
goto :endofscript

:next
echo "Doing the next thing"

:endofscript
echo "Script complete"

8

真是费了我好大的劲才找到答案... 这里是:

cd thisDoesntExist
if %errorlevel% == 0 (
  echo Oh, I guess it does
  echo Huh.
)

2

我不确定javaw是否会写入%errorlevel%变量,但它可能会。

直接运行后使用echo %errorlevel%查看。

除此之外,您可以将javaw的输出导入文件,然后使用find查看结果。如果不知道输出内容,我无法提供更多帮助。


0

所以从逻辑上讲,这将测试成功:

if not errorlevel 1 echo success

嗯,除非有负的退出代码,这是不寻常的。这也有一个额外的好处,可以看到错误级别是什么。

if %errorlevel%==0 echo success

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接