带有任务计划程序返回码的嵌套批处理文件

时间:2015-06-25 06:29:56

标签: batch-file error-handling scheduled-tasks

我有一些批处理文件在一周的某几天运行某些任务,我认为他们工作正常,直到我的同事需要任务,指出我的代码发送的电子邮件说该过程失败了,但是任务计划程序指示任务正常运行。然后我们检查了输出,看起来它们是正确的。

基本上我的批处理文件调用另一个批处理文件,一个运行可执行文件,有时运行一个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因错误而失败,处理错误,并返回错误代码”。

3 个答案:

答案 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%不变。
  • 但是,CLI(以及批处理脚本)中的非零错误级别始终由(至少)语法错误引发。

所以您的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}}