Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理文件-错误处理_Batch File - Fatal编程技术网

Batch file 批处理文件-错误处理

Batch file 批处理文件-错误处理,batch-file,Batch File,我目前正在编写部署asp.net解决方案的第一批文件。 我在谷歌上搜索了一下通用的错误处理方法,但没有找到任何真正有用的方法 基本上,如果有什么事情出了问题,我想停下来,把出了问题的地方打印出来 有人能给我一些提示吗?除了ERRORLEVEL之外,批处理文件没有错误处理。您可能想看看更强大的脚本语言。我一直在把代码转移到 能够轻松使用.Net程序集和方法是我开始使用PowerShell的主要原因之一。改进的错误处理是另一个问题。事实上,微软现在要求其所有服务器程序(Exchange、SQL se

我目前正在编写部署asp.net解决方案的第一批文件。 我在谷歌上搜索了一下通用的错误处理方法,但没有找到任何真正有用的方法

基本上,如果有什么事情出了问题,我想停下来,把出了问题的地方打印出来


有人能给我一些提示吗?

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

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


现在看来,在学习和使用PowerShell上投入的任何时间都会花得很好。

我通常认为条件命令串联运算符比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检测错误时所需的复杂性示例,请参阅。

使用
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

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

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

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

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

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

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

call <filename>  // the file you made
cls
echo An error occured!
<Your commands>
pause
调用//您创建的文件
cls
回显发生错误!
暂停

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

Python Unittest,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()
Bat代码:

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

是的,我希望我用PowerShell来完成它,有一种感觉,破解批处理脚本并不是很好地花费时间。毫无疑问,PowerShell是一种高级语言。但是ERRORLEVEL并不是批处理的唯一方法-请看,您是否介意提供一个简单的复制或删除命令示例,这比跟踪
ERRORLEVEL
要好得多,谢谢!我尝试了del,但它总是输出它是成功的,即使文件不是there@Xerus-是的,DEL(或ERASE)命令存在严重缺陷,因为它总是将ERRORLEVEL设置为0,并且只要参数有效,即使删除失败,也不会触发
|
。但是,如果删除失败,它会向stderr打印一条错误消息。您可以执行以下操作来检测DEL stderr消息(注意反向逻辑)
DEL“yourFile”2>&1>nul | findstr“^”>nul&&echo FAIL | | echo OK
我也做了同样的事情来避免自动退出
cmd.exe
。在第一次查看时,我没有得到这个消息。为了给其他人节省一些时间,这意味着:如果在以前的输出中查找“ERROR”的命令成功(ERRORLEVEL不>=1,因此包含0以外的任何返回代码),它将显示消息“.发生了错误”,并返回状态代码1,通知调用过程有错误。