【问题标题】:Batch Files - Error Handling批处理文件 - 错误处理
【发布时间】:2010-11-12 22:30:58
【问题描述】:

我目前正在编写我的第一个批处理文件来部署一个 asp.net 解决方案。 我一直在谷歌上搜索一般错误处理方法,但找不到任何真正有用的东西。

基本上,如果出现任何问题,我想停下来打印出问题所在。

谁能指点一下?

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    我通常发现条件命令连接运算符比 ERRORLEVEL 方便得多。

    yourCommand && (
      echo yourCommand was successful
    ) || (
      echo yourCommand failed
    )
    

    您应该注意一个并发症。如果成功分支中的最后一个命令引发错误,则会触发错误分支。

    yourCommand && (
      someCommandThatMayFail
    ) || (
      echo This will fire if yourCommand or someCommandThatMayFail raises an error
    )
    

    修复方法是在成功分支的末尾插入一个保证成功的无害命令。我喜欢使用(call ),它除了将 ERRORLEVEL 设置为 0 之外什么都不做。推论 (call) 除了将 ERRORLEVEL 设置为 1 之外什么都不做。

    yourCommand && (
      someCommandThatMayFail
      (call )
    ) || (
      echo This can only fire if yourCommand raises an error
    )
    

    有关使用 ERRORLEVEL 检测错误时所需的复杂性示例,请参阅 Foolproof way to check for nonzero (error) return code in windows batch file。

    【讨论】:

    • 您介意提供一个带有复制或删除命令的简单示例吗?
    • 比跟踪ERRORLEVEL好多了,谢谢!
    • 我用 del 试过了,但它总是输出成功,即使文件不存在
    • @Xerus - 是的,DEL(或 ERASE)命令存在严重缺陷,因为它总是将 ERRORLEVEL 设置为 0,并且只要参数有效,即使删除也不会触发 ||失败。但是,如果删除失败,它会向 stderr 打印一条错误消息。您可以执行以下操作来检测 DEL stderr 消息(注意逆逻辑)DEL "yourFile" 2>&1 >nul|findstr "^" >nul && echo FAIL || echo OK
    • 我做了同样的事情来避免cmd.exe的自动退出。
    【解决方案2】:

    在可用时使用 ERRORLEVEL 是最简单的选择。但是,如果您正在调用外部程序来执行某些任务,并且它没有返回正确的代码,您可以通过管道将输出传递到“find”并从中检查错误级别。

    c:\mypath\myexe.exe | find "ERROR" >nul2>nul
    if not ERRORLEVEL 1 (
    echo. Uh oh, something bad happened
    exit /b 1
    )
    

    或者提供更多关于发生了什么的信息

    c:\mypath\myexe.exe 2&1> myexe.log
    find "Invalid File" "myexe.log" >nul2>nul && echo.Invalid File error in Myexe.exe && exit /b 1
    find "Error 0x12345678" "myexe.log" >nul2>nul && echo.Myexe.exe was unable to contact server x && exit /b 1
    

    【讨论】:

    • 乍一看,我没有得到那个。为了为其他人节省一些时间,这意味着:如果在先前输出中查找“ERROR”的命令成功(ERRORLEVEL 不 >= 1,因此涵盖了 0 以外的任何返回代码),它会向您显示消息“..发生了一些不好的事情”,它返回状态码 1,通知调用过程发生了错误。
    【解决方案3】:

    除了 ERRORLEVEL,批处理文件没有错误处理。你会想看看更强大的脚本语言。我一直在将代码移至PowerShell。

    能够轻松使用 .Net 程序集和方法是我开始使用 PowerShell 的主要原因之一。改进的错误处理是另一个。微软现在要求其所有服务器程序(Exchange、SQL Server 等)都可以通过 PowerShell 驱动这一事实简直是锦上添花。

    现在看来,花在学习和使用 PowerShell 上的时间都值得花时间。

    【讨论】:

    • 是的,我希望我是使用 power shell 来完成的,感觉黑客批处理脚本不是花时间......
    • 毫无疑问,PowerShell 是一种高级语言。但 ERRORLEVEL 并不是批处理的唯一方法 - 请参阅 my answer
    【解决方案4】:

    可以使用ERRORLEVEL 捕获本地网络上的成功 ping。

    @ECHO OFF
    PING 10.0.0.123
    IF ERRORLEVEL 1 GOTO NOT-THERE
    ECHO IP ADDRESS EXISTS
    PAUSE
    EXIT
    :NOT-THERE
    ECHO IP ADDRESS NOT NOT EXIST
    PAUSE
    EXIT
    

    【讨论】:

      【解决方案5】:

      我猜这个功能是从 OP 开始添加的,但是为了将来参考,可以将在命令窗口中输出的错误重定向到独立于标准输出的文件

      command 1> file - 将命令的标准输出写入文件

      command 2> file - 将命令的标准错误写入文件

      【讨论】:

        【解决方案6】:

        Python 单元测试,Bat 进程错误代码:

        if __name__ == "__main__":
           test_suite = unittest.TestSuite()
           test_suite.addTest(RunTestCases("test_aggregationCount_001"))
           runner = unittest.TextTestRunner()
           result = runner.run(test_suite)
           # result = unittest.TextTestRunner().run(test_suite)
           if result.wasSuccessful():
               print("############### Test Successful! ###############")
               sys.exit(1)
           else:
               print("############### Test Failed! ###############")
               sys.exit()
        

        蝙蝠代码:

        @echo off
        for /l %%a in (1,1,2) do (
        testcase_test.py && (
          echo Error found. Waiting here...
          pause
        ) || (
          echo This time of test is ok.
        )
        )
        

        【讨论】:

          【解决方案7】:

          非常简单! 创建一个包含以下内容的文件:

          call <filename>  // the file you made
          cls
          echo An error occured!
          <Your commands>
          pause
          

          所以现在当您启动它时,它会正常启动您的程序。但是当出现任何问题时,它会退出并继续第一个文件中的脚本。现在你可以在那里输入你自己的命令了。

          【讨论】:

            猜你喜欢
            • 2017-10-26
            • 2018-04-21
            • 1970-01-01
            • 2022-01-05
            • 2016-02-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多