【发布时间】:2010-11-12 22:30:58
【问题描述】:
我目前正在编写我的第一个批处理文件来部署一个 asp.net 解决方案。 我一直在谷歌上搜索一般错误处理方法,但找不到任何真正有用的东西。
基本上,如果出现任何问题,我想停下来打印出问题所在。
谁能指点一下?
【问题讨论】:
标签: batch-file
我目前正在编写我的第一个批处理文件来部署一个 asp.net 解决方案。 我一直在谷歌上搜索一般错误处理方法,但找不到任何真正有用的东西。
基本上,如果出现任何问题,我想停下来打印出问题所在。
谁能指点一下?
【问题讨论】:
标签: batch-file
我通常发现条件命令连接运算符比 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好多了,谢谢!
||失败。但是,如果删除失败,它会向 stderr 打印一条错误消息。您可以执行以下操作来检测 DEL stderr 消息(注意逆逻辑)DEL "yourFile" 2>&1 >nul|findstr "^" >nul && echo FAIL || echo OK
cmd.exe的自动退出。
在可用时使用 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
【讨论】:
除了 ERRORLEVEL,批处理文件没有错误处理。你会想看看更强大的脚本语言。我一直在将代码移至PowerShell。
能够轻松使用 .Net 程序集和方法是我开始使用 PowerShell 的主要原因之一。改进的错误处理是另一个。微软现在要求其所有服务器程序(Exchange、SQL Server 等)都可以通过 PowerShell 驱动这一事实简直是锦上添花。
现在看来,花在学习和使用 PowerShell 上的时间都值得花时间。
【讨论】:
可以使用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
【讨论】:
我猜这个功能是从 OP 开始添加的,但是为了将来参考,可以将在命令窗口中输出的错误重定向到独立于标准输出的文件
command 1> file - 将命令的标准输出写入文件
command 2> file - 将命令的标准错误写入文件
【讨论】:
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.
)
)
【讨论】:
非常简单! 创建一个包含以下内容的文件:
call <filename> // the file you made
cls
echo An error occured!
<Your commands>
pause
所以现在当您启动它时,它会正常启动您的程序。但是当出现任何问题时,它会退出并继续第一个文件中的脚本。现在你可以在那里输入你自己的命令了。
【讨论】: