40

我想用批处理文件启动一个进程,如果它返回非零,则执行其他操作。我需要正确的语法。

像这样的东西:

::x.bat

@set RetCode=My.exe
@if %retcode% is nonzero
   handleError.exe

作为奖励,您可以考虑回答以下问题:)

  • 如何用 编写复合语句if
  • 如果应用程序My.exe由于缺少某些 DLL 而无法启动,我的 if 是否可以工作?如果没有,我如何检测到My.exe无法启动?
4

6 回答 6

65

ERRORLEVEL将包含最后一个命令的返回码。可悲的是,您只能检查>=它。

请特别注意MSDN 文档中If声明的这一行:

错误级别

仅当 Cmd.exe 运行的前一个程序返回的退出代码等于或大于Number时,才指定一个真条件。

因此,要检查 0,您需要跳出框框思考:

IF ERRORLEVEL 1 GOTO errorHandling
REM no error here, errolevel == 0
:errorHandling

或者,如果您想先编写错误处理代码:

IF NOT ERRORLEVEL 1 GOTO no_error
REM errorhandling, errorlevel >= 1
:no_error

有关 BAT 编程的更多信息:http ://www.ercphelps.com/batch/ 或更具体的 Windows cmdMSDN 使用批处理文件

于 2010-12-15T14:40:34.497 回答
18

如何用if编写复合语句?

您可以使用括号在 if 块中编写复合语句。第一个括号必须与 if 在一行,第二个单独在一行。

if %ERRORLEVEL% == 0 (
    echo ErrorLevel is zero
    echo A second statement
) else if %ERRORLEVEL% == 1 (
    echo ErrorLevel is one
    echo A second statement
) else (
   echo ErrorLevel is > 1
   echo A second statement
)
于 2010-12-15T15:06:58.283 回答
6

这不完全是问题的答案,但每次我想知道如何让我的批处理文件退出时出现错误代码,当进程返回非零代码时,我都会在这里结束。

所以这是答案:

if %ERRORLEVEL% NEQ 0 exit %ERRORLEVEL%
于 2019-01-24T21:55:19.567 回答
4

我正在做的项目,我们做这样的事情。我们使用errorlevel关键字,所以它看起来像:

call myExe.exe
if errorlevel 1 (
  goto build_fail
)

这似乎对我们有用。请注意,您可以在括号中放入多个命令,例如 echo 或其他。另请注意, build_fail 定义为:

:build_fail
echo ********** BUILD FAILURE **********
exit /b 1
于 2010-12-15T14:43:07.760 回答
0

您可以使用以下命令检查它是否返回 0 或 1 :

在下面的示例中,我正在检查一个特定文件中的字符串,如果文件中不存在该特定单词“Error”,则该字符串将为您提供 1,如果存在则为 0

find /i "| ERROR1 |" C:\myfile.txt
echo %errorlevel%

if %errorlevel% equ 1 goto notfound
goto found
:notfound
exit 1
:found
echo we found the text.
于 2020-06-04T17:58:02.080 回答
0

要检查进程/命令是否返回 0,请使用操作符:&& == 0 or not == 0 ||

只需将运算符添加到您的脚本中:

execute_command && (

       echo\Return 0, with no execution error
) || (
        echo\Return non 0, something went wrong
     )

command && echo\Return 0 || echo\Return non 0
于 2020-09-15T09:04:27.243 回答