批处理文件 - 错误处理

时间:2009-07-22 09:15:17

标签: batch-file

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

基本上如果出现任何问题我想停下来打印出错的地方。

任何人都可以给我任何指示吗?

7 个答案:

答案 0 :(得分:62)

我通常发现条件命令连接运算符比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之外什么都不做。除了将ERRORLEVEL设置为1之外,还有一个推论(call)除外。

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

答案 1 :(得分:8)

在可用时使用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

答案 2 :(得分:7)

除了ERRORLEVEL之外,批处理文件没有错误处理。您想要查看更强大的脚本语言。我一直在将代码移到PowerShell

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

现在,看起来任何时候投入学习和使用PowerShell的时间都会很长。

答案 3 :(得分: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

答案 4 :(得分:0)

我想这个功能是自OP以来添加的,但是对于将在命令窗口中输出的未来参考错误,可以重定向到独立于标准输出的文件

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

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

答案 5 :(得分:0)

Python Unittest,Bat process错误代码:

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.
)
)

答案 6 :(得分:-4)

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

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

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