2015-06-25 46 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% 
相關問題