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

我认为您应该perl.exe使用脚本作为参数进行调用:

perl ssutexec.pl prog=MyProg ...

在我的测试中,如果我只有脚本名称,则会提示我要使用什么来打开test.pl文件。这意味着perl.exe没有执行我的 Perl 代码。

您的文件关联可能存在,但由于Windows 的细微差别,您的脚本仍然可能失败。

我用我的两个非常简单的脚本进行了测试:

测试.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 回答
2

使用批处理文件真的很痛苦(DOS 批处理文件使 bash 脚本看起来很棒,而 bash 很臭!)。问题可能来自批处理文件处理变量扩展的方式。这里有一些尝试:

  1. 将以下行添加到批处理脚本的顶部(我通常将其放在顶部,就在我的@echo off行下方):setlocal enabledelayedexpansion
  2. 将所有%ERRORLEVEL%引用更改为!ERRORLEVEL!(感叹号而不是百分号)。

这些更改将导致变量在执行时而不是在解析时扩展。当不使用延迟扩展选项时,我已经看到%ERRORLEVEL%值被破坏了。阅读此EnableDelayedExpansion 信息页面了解更多信息。

于 2013-01-23T21:40:07.720 回答