我有一些批处理文件在一周的某几天运行某些任务,我认为他们工作正常,直到我的同事需要任务,指出我的代码发送的电子邮件说该过程失败了,但是任务计划程序指示任务正常运行。然后我们检查了输出,看起来它们是正确的。
基本上我的批处理文件调用另一个批处理文件,一个运行可执行文件,有时运行一个python程序(取决于它是哪个任务)。然后检查该批处理文件的返回代码并发送相应的电子邮件(我已经在下面附上了我的这些批处理文件的代码)。
我的问题是:如果可执行文件失败,因此内部批处理文件失败并且运行失败的电子邮件python脚本,整个批处理文件是否返回为0x00?还是会因为“某事”出错而返回内部批处理文件的错误代码?
ECHO ON
cd G:\Reports\Batch Files\
G:
call ContactsReview.bat
IF %ERRORLEVEL% NEQ 0 (
python G:\mtsprograms\python\ContactsFailed.py
)
IF %ERRORLEVEL% EQU 0 (
python G:\mtsprograms\python\ContactsReviewEmail.py
)
我对此问题的推理是,如果ContactsReview.bat失败并且错误检查运行ContactsFailed.py脚本,整个批处理文件是否会认为“嘿,我完成了我的脚本,返回0x00”?我编写此代码假设它会认为“ContactsReview.bat因此错误而失败,处理错误,并返回错误代码”。
答案 0 :(得分:1)
考虑一下 - 您通过ERRORLEVEL检测到错误,但随后又运行了另一个命令(python)。所以现在你的ERRORLEVEL报告你的python命令的返回状态,而不是你的ContactsReview.bat调用。
如果要保留ERRORLEVEL,则必须将其保存在变量中,然后可以使用EXIT / B以适当的返回码退出主脚本。
有一点需要注意 - 每次调用python.exe等外部命令时,ERRORLEVEL都会设置为新的返回码。但是cmd.exe与处理内部命令的方式不一致。通常,如果发生错误(DEL是一个例外),所有内部命令都将设置ERRORLEVEL,但是某些命令(如ECHO和GOTO)在成功时不会清除ERRORLEVEL,而其他命令(如DIR和CD)会在成功时清除ERRORLEVEL。
无论如何,以下内容可以解决您的问题。
echo on
cd /d G:\Reports\Batch Files\
call ContactsReview.bat
set "err=%errorlevel%"
if %err% neq 0 (
python G:\mtsprograms\python\ContactsFailed.py
) else (
python G:\mtsprograms\python\ContactsReviewEmail.py
)
exit /b %err%
答案 1 :(得分:0)
您使用if errorlevel 1 if not errorlevel 2 echo exit 1
。
您测试errorlevel并使用您想要的任何代码退出。请参阅/b
参数
答案 2 :(得分:0)
阅读%errorlevel%:
几乎所有应用程序和实用程序都会设置退出代码 完成/终止
%errorlevel%
不变。 所以您的ContactsReview.bat
可以如下(note exit /B %AppErrorlevel%
); :
:: some stuff
:: clear errorlevel before calling your app:
(call )
:: execute your app (executable) here
:: remember errorlevel raised by your app:
set /A "AppErrorlevel=errorlevel"
:: other stuff which could raise non-zero error level although your app succeeds
:: force your batch to return right errorlevel code:
exit /B %AppErrorlevel%
了解更多如何在dbenham对SuperUser中另一个问题的回答中%errorlevel%
0
强制(call )
0
:
如果要将错误级别强制为
(call )
,则可以使用此值 完全不直观但非常有效的语法:1
。 空间 通话后很重要。如果要将errorlevel设置为(call)
,则为您 可以使用(call) echo %errorlevel% (call ) echo %errorlevel%
。至关重要的是,呼叫后没有任何空间。{{1}}