2

Perl スクリプト ファイルを呼び出す DOS バッチ ファイルがあります。

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 スクリプト ファイル内で、エラー条件が実行され、スクリプトは exit($status) で終了します。

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 スクリプトの専門家ではありません。エラーレベルがトリガーされていないため、エラーが発生していません。DOS バッチ ファイル内の perl スクリプト終了コードの値をトラップするにはどうすればよいですか?

編集を含む: 新しいバッチ ファイルは次のようになります。

@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% 
4

2 に答える 2

2

バッチ ファイルを扱うのは本当に面倒です (DOS バッチ ファイルを使用すると、bash スクリプトの見栄えが良くなりますが、bash は悪臭を放ちます!)。問題は、バッチ ファイルが変数展開を処理する方法から発生している可能性があります。ここで試してみてください:

  1. バッチ スクリプトの先頭に次の行を追加します (通常、行のすぐ下の先頭に追加します@echo off)。setlocal enabledelayedexpansion
  2. %ERRORLEVEL%すべての参照を代わりに変更します!ERRORLEVEL!(パーセント記号の代わりに感嘆符)。

これらの変更により、解析時ではなく実行時に変数が展開されるようになります。%ERRORLEVEL%遅延拡張オプションを使用しないと、値が壊れるのを見てきました。詳細については、このEnableDelayedExpansion 情報ページをお読みください。

于 2013-01-23T21:40:07.720 に答える
2

perl.exeスクリプトを引数として呼び出す必要があると思います:

perl ssutexec.pl prog=MyProg ...

私のテストでは、スクリプト名だけがあれば、ファイルを開くために何を使用するかを尋ねられtest.plます。つまりperl.exe、Perl コードを実行していません。

ファイルの関連付けはそこにある可能性がありますが、Windows のニュアンスが原因で、スクリプトがまだ失敗している可能性があります。

2 つの非常に単純なスクリプトでテストしました。

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
于 2013-01-23T21:55:53.090 に答える