【问题标题】:Check if process returns 0 with batch file检查进程是否使用批处理文件返回 0
【发布时间】:2011-05-25 23:02:54
【问题描述】:

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

类似这样的:

::x.bat

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

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

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

【问题讨论】:

    标签: windows process batch-file exit-code


    【解决方案1】:

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

    特别注意MSDN documentation for the If statement中的这一行:

    错误级别数字

    指定一个真 仅当前一个程序的条件 由 Cmd.exe 运行返回退出代码 等于或大于数字

    所以要检查 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.ericphelps.com/batch/ 或者更具体的 Windows cmdMSDN using batch files

    【讨论】:

    • @Armen:这就是为什么您需要以 reverse 顺序检查返回码的原因。从可能的最高数字开始,然后下降到零。编辑:我刚刚意识到您的问题是询问如何检查返回码是否为非零。在这种情况下,ERRORLEVEL 正是您想要的。只要返回码等于或高于指定值,Eduard 发布的语句就会返回 TRUE。
    • 你的意思是没有办法直接检查某个变量不等于某个值?
    • 如果 errorlevel 0 始终为真,因为如果 errorlevel 为 0 或更大,则为真,如果 /? 读取
    • 这不适用于 Windows 10.0.14393。例如,当 .net 程序由于异常而退出时,它会返回一个否定的错误代码。对于ECHO %ERRORLEVEL%,我得到-532462766。和IF ERRORLEVEL 1 (ECHO failed) ELSE (ECHO succeeded) 输出succeeded。因此,这不是检测非零返回值的可靠方法——它只是检测大于零返回值的可靠方法。
    • 我建议使用IF %ERRORLEVEL% NEQ 0 or IF NOT ERRORLEVEL 1 IF ERRORLEVEL 0 «success action» 来支持检测负返回值并取决于您是否知道%ERRORLEVEL% 可以安全访问。
    【解决方案2】:

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

    call myExe.exe
    if errorlevel 1 (
      goto build_fail
    )
    

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

    :build_fail
    echo ********** BUILD FAILURE **********
    exit /b 1
    

    【讨论】:

    • 你的 if 检查返回码是 1 还是非零?
    • 你最好使用 if %errorlevel% NEQ 0,因为如果 errorlevel 等于或大于 [number] 时 if errorlevel [number] 为真,试试看 if /?
    • @jeb 但前提是您确定没有人意外分配给 ERRORLEVEL 变量,对吧?
    • @binki IF ERRORLEVEL 1 对于 ERRORLEVEL >= 1 为真,但对于负 ERRORLEVEL = 1 和负
    • @Kristen 但是检查%ERRORLEVEL% is not the same as checking ERRORLEVEL 可能会导致意外行为,除非您确定您使用的所有脚本都遵循this advice to never SET ERRORLEVEL=。所以避开%ERRORLEVEL%只是一种防御技巧。
    【解决方案3】:

    如何编写复合语句 如果?

    您可以使用括号在 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
    )
    

    【讨论】:

    • 这是用什么语言写的?这个问题被标记为“批处理”,所以我很确定我们正在寻找一个批处理文件。你的代码不会像你想象的那样工作。
    • 我在 ERRORLEVEL 周围省略了 %。这些已经添加,所以现在它可以正常工作了。
    • 这个答案似乎是 WRONG,因为如果“错误级别等于 或大于 Number”,则 if 返回 true。见answer by Eduard Wirch
    • @koppor - 因为它使用%ERRORLEVEL% 而不是ERRORLEVEL,所以它可以工作。使用 % 时,它是一个普通的批处理变量,但没有它时,它是 if 的特殊形式,具有特殊的大于逻辑。
    • echo ErrorLevel is > 1 会将ErrorLevel is 写入名为1 的文件中。
    【解决方案4】:

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

    所以这里是答案:

    if %ERRORLEVEL% NEQ 0 exit %ERRORLEVEL%
    

    【讨论】:

    • 为什么是if?只是exit %errorlevel% 是一样的。即使只是exit 也会隐式执行exit %errorlevel%
    • @stephan 就我而言,我想在出错时中止脚本的其余部分。
    • option /B by exist 需要在批处理文件中使用它,例如。 G。 > 存在 /B 127
    【解决方案5】:

    您可以使用以下命令检查它是否返回 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.
    

    【讨论】:

      【解决方案6】:

      要检查进程/命令是否返回 0,请使用运算符 <b>&amp;&amp; == 0 <i>or <strike> not == 0</strike> </i> ||</b>

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

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

      command <b>&amp;&amp;</b> echo\Return <b>0</b> <b>||</b> echo\Return <b>non 0</b>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-05
        • 1970-01-01
        • 2015-07-09
        • 2013-07-18
        • 2013-04-27
        相关资源
        最近更新 更多