2015-06-25 44 views
0

我有一些批处理文件在一周中的某几天运行某些任务,我认为它们工作正常,直到我的需要任务的同事指出我的代码正在发送电子邮件说这个过程失败了,但是Task Scheduler表明任务运行正常。然后我们检查了输出结果,他们似乎是正确的。带任务计划程序的嵌套批处理文件返回码

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

回答

1

想一想 - 您通过ERRORLEVEL检测到错误,但是接着运行另一个命令(python)。所以现在你的ERRORLEVEL报告你的python命令的返回状态,而不是你的ContactsReview.bat调用。

如果您想保留ERRORLEVEL,您必须将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% 
0

您使用if errorlevel 1 if not errorlevel 2 echo exit 1

你测试errorlevel并退出你想要的任何代码。请参阅/b参数

+0

的OP是询问如何保持ERRORLEVEL和返回值,而不是如何检测错误。 – dbenham

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% 

详细了解如何通过(call)命令dbenham的回答迫使%errorlevel%0另一个问题在超级用户:setting ERRORLEVEL to 0

如果您想将错误级别强制0,那么你可以使用这个 完全不直观,但非常有效的语法:(call)呼叫后的空间 至关重要。如果要将错误级别设置为1,则您的 可以使用(call)。通话后没有空间是至关重要的。

(call) 
echo %errorlevel% 
(call) 
echo %errorlevel% 
相关问题