Возвращаемое значение Perl Script в пакетном файле 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
 )

Внутри файла сценария perl ssutexec.pl выполняется условие ошибки, и сценарий завершается с выходом ($ 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-скриптов. Errorlevel не запускается, поэтому я не получаю сообщение об ошибке. Как я могу уловить значение кода выхода сценария perl в моем командном файле DOS?

ЗАКРЫТИЕ РЕДАКТИРОВАНИЯ: новый командный файл выглядит так:

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

person MikeTWebb    schedule 23.01.2013    source источник
comment
Вы уверены, что $status в сценарии Perl установлено ненулевое значение?   -  person Jonah Bishop    schedule 24.01.2013
comment
@Jonah ... да, оператор Print в коде выводит значение 44   -  person MikeTWebb    schedule 24.01.2013
comment
@MikeTWebb Каково значение $ status после этих двух последних вызовов system () прямо перед выходом?   -  person Craig Treptow    schedule 24.01.2013


Ответы (2)


Работа с пакетными файлами действительно может быть проблемой (пакетные файлы DOS делают сценарии bash прекрасными, а bash воняет!). Проблема может возникнуть из-за того, как пакетные файлы обрабатывают расширение переменных. Вот что можно попробовать:

  1. Добавьте следующую строку вверху вашего пакетного скрипта (я обычно помещаю ее вверху, прямо под моей строкой @echo off): setlocal enabledelayedexpansion
  2. Вместо этого замените все ссылки %ERRORLEVEL% на !ERRORLEVEL! (восклицательные знаки вместо знаков процента).

Эти изменения приведут к тому, что переменные будут расширяться во время выполнения, а не во время синтаксического анализа. Я видел, как значение %ERRORLEVEL% искажалось, когда не использовалась опция отложенного расширения. Прочтите эту страницу с информацией о EnableDelayedExpansion для получения дополнительной информации.

person Jonah Bishop    schedule 23.01.2013
comment
@Jonah ... Я также попробую завтра и опубликую результат. И спасибо! - person MikeTWebb; 24.01.2013
comment
@Jonah ... Я пробовал это, но в моем сценарии все равно нет! Errorlevel! Переменная - person MikeTWebb; 25.01.2013
comment
Хм. Вот еще одна вещь, которую стоит попробовать ... попробуйте заключить условное выражение в кавычки: if not "%status%" == "0" - person Jonah Bishop; 25.01.2013

Я думаю, вам следует вызвать perl.exe со сценарием в качестве аргумента:

perl ssutexec.pl prog=MyProg ...

В моих тестах, если у меня есть только имя сценария, мне предлагается указать, что я хочу использовать для открытия файла test.pl. Это означает, что perl.exe не выполняет мой код Perl.

Скорее всего, ваши файловые ассоциации могут быть там, но ваш скрипт все равно может не работать из-за нюансов 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
person Craig Treptow    schedule 23.01.2013
comment
Прагма strict позволяет выполнять ряд проверок безопасности вашего кода. Приветствуется его использование в производственной среде. Однако не удивляйтесь, если ваш сценарий изначально задыхается; это не зря называется строгим. - person Jonah Bishop; 24.01.2013
comment
@Craig .... Я попробовал описанный выше сценарий, и он работал с test.pl, который вызывается perl и без него. Энди идеи? - person MikeTWebb; 24.01.2013