batch file – error handling

我目前正在写我的第一批文件部署一个asp.net解决scheme。 我一直在谷歌search一般的error handling方法,并找不到任何真正有用的东西。

基本上,如果出现任何问题,我想停下来打印出什么地方出了问题。

任何人都可以给我任何指针?

我通常发现条件命令连接操作符比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 ) 

请参阅用于检查Windowsbatch file中的非零(错误)返回码的万无一失的方法,以了解使用ERRORLEVEL检测错误时所需的错综复杂的示例。

除了ERRORLEVEL,batch file没有error handling。 你会想看看更强大的脚本语言。 我一直在把代码移到PowerShell 。

轻松使用.Net程序集和方法的能力是我开始使用PowerShell的主要原因之一。 改进的error handling是另一个。 微软现在要求所有的服务器程序(Exchange,SQL Server等)都是PowerShell可驱动的事实是纯粹的锦上添花。

现在,看起来任何时间投入学习和使用PowerShell将花费时间。

当它可用时使用ERRORLEVEL是最简单的select。 但是,如果您调用外部程序来执行某个任务,并且不返回正确的代码,则可以将输出传送到“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 

可以使用ERRORLEVEL捕获本地networking上的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 

我猜这个function是从OP开始添加的,但是将来的参考错误可以在命令窗口中输出,可以redirect到一个独立于标准输出的文件

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

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

Pythonunit testing,蝙蝠进程错误代码:

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

它非常简单! 创build一个文件,其中包含:

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

所以现在当你启动它时,它将正常启动你的程序。 但是,如果出现任何问题,则退出并继续执行第一个文件中的脚本。 现在你可以把你自己的命令放进去了。