2013-01-23 92 views
2

我有一個調用一個Perl腳本文件中的DOS批處理文件:在DOS批處理文件的Perl腳本返回值

ssutexec.pl prog=MyProg I_CARD=MyCard O_F071=ME007 F70P=MYF70P TRIG=MYTRIG 
set status=%errorlevel% 
if NOT %status% == 0 (
    echo ******************************************************* 
    echo MPSBM070 JOB stopped with a RETURN CODE of %status% 
    echo ************** END OF JOB ***************************** 
    goto JobEnd 
) 

裏面的ssutexec.pl Perl腳本文件,則執行出錯條件和腳本退出退出($狀態):

if ($status != 0) 
{ 
    system("ssutdttm.pl SSUTEXEC \"finished processing $prog_nam (Abnormal End) on\"") ; 
    print "******************************************************************" ; 
    print "    JOB STOPPED - Due to Return code of ($status)" ; 
    print "*****************END OF JOB***************************************" ; 
    system("ssutdttm.pl SSUTEXEC \"finished processing $prog_nam (Abnormal End) on\"") ; 
    system("ssuttmdr.pl -c -b $starttime -m \"$prog_nam\"") ; 
    exit($status) ; 
} 

我不是一個perl腳本的傢伙。 Errorlevel沒有被觸發,所以我沒有收到錯誤。如何在我的DOS批處理文件中捕獲perl腳本退出代碼的值?

INDLUDING編輯: 新的批處理文件看起來是這樣的:

@echo off 
setlocal enabledelayedexpansion 


if not defined run_env goto ScriptExit 

echo ****************************************************************** 
echo *      MYPROG         * 
echo ****************************************************************** 

perl ssutdttm.pl MYPROG Start - 
perl ssutexec.pl prog=MyProg I_CARD=MyCard O_F071=ME007 F70P=MYF70P TRIG=MYTRIG 
set status=!errorlevel! 
if NOT %status% == 0 (
    echo ******************************************************* 
    echo MYPROG JOB stopped with a RETURN CODE of %status% 
    echo ************** END OF JOB ***************************** 
    goto JobEnd 
) 

:JobEnd 
    if %status% == 0 (
    echo ******************************************************* 
    echo  NORMAL END OF JOB - RETURN CODE of %status% 
    echo ******** NORMAL END OF JOB **************************** 
    ) ELSE (
    echo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    echo  ABNORMAL END OF JOB - RETURN CODE of %status% 
    echo !!!!!! ABNORMAL END OF JOB !!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    ) 
    ssutdttm.pl MYPROG end - 
    exit /b %status% 
:: 
:ScriptExit 
echo run_env: %run_env% 
+0

我和我的兩個非常簡單的測試腳本你確定'$ status'被設置爲一個非零的值你在Perl腳本中? –

+0

@Jonah ...是的,代碼中的打印語句輸出值爲44 – MikeTWebb

+0

@MikeTWebb在退出之前最後兩個system()調用之後,$ status的值是多少? –

回答

2

與批處理文件的工作才能真正成爲一個痛苦(DOS批處理文件做出的bash腳本看起來棒極了,和bash太臭!)。問題可能會從批處理文件處理變量擴展的方式出現。下面是一些嘗試:

  1. 以下行添加到您的批處理腳本的頂部(我通常把它的頂部,只是在我的@echo off線):setlocal enabledelayedexpansion
  2. 更改所有%ERRORLEVEL%引用!ERRORLEVEL!代替(感嘆號而不是百分號)。

這些更改會導致變量在執行時而不是在分析時被擴展。我已經看到%ERRORLEVEL%值在不使用延遲擴展選項時會發生錯位。請閱讀EnableDelayedExpansion information page瞭解更多信息。

+0

@Jonah ...我會明天給你一個嘗試,併發布結果。也謝謝! – MikeTWebb

+0

@Jonah ...我試過了,但仍然沒有看到!errorlevel!變量 – MikeTWebb

+0

嗯。還有一件事要嘗試......試着用條件包裝你的條件:'如果不是'%status%== == 0'' –

1

我想你應該用腳本作爲參數調用perl.exe

perl ssutexec.pl prog=MyProg ...

在我的測試中,如果我剛纔的腳本名稱,我得到提示什麼,我想用它來打開test.pl文件。這意味着perl.exe不會執行我的Perl代碼。

您的文件關聯可能存在,但由於nuances of Windows,您的腳本仍可能失敗。

test.bat的

@ECHO OFF 

perl test.pl 

set status=%errorlevel% 

if NOT %status% == 0 (
echo status was set with value of %status% 
) 

和test.pl

use warnings; 
use strict; 

my $status = 44; 

exit($status) 

和預期輸出:

C:\Dropbox\Programming\Perl\Learn\blah>test 
status was set with value of 44 
+0

@Craig ....明天我會給它一個測試。謝謝,男人 – MikeTWebb

+0

@克雷格....使用嚴格對我們有什麼用? – MikeTWebb

+1

[strict](http://perldoc.perl.org/strict.html)附註對您的代碼進行了一堆安全檢查。鼓勵在生產環境中使用它。不過,如果你的劇本最初窒息,不要感到驚訝;它沒有被稱爲「嚴格」。 –