DOS批处理文件中的Perl脚本返回值

DOS批处理文件中的Perl脚本返回值,perl,error-handling,batch-file,exit-code,Perl,Error Handling,Batch File,Exit Code,我有一个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 RE

我有一个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脚本文件中,将执行一个错误条件,脚本将以exit($status)退出:

我不是一个喜欢perl脚本的人。Errorlevel没有被触发,因此我没有收到错误。如何在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% 

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

  • 将以下行添加到批处理脚本的顶部(我通常将其放在顶部,就在我的
    @echo off
    行下方):
    setlocal enabledelayedexpansion
  • 将所有
    %ERRORLEVEL%
    引用更改为
    !错误等级代替(感叹号代替百分号)

  • 这些更改将导致变量在执行时展开,而不是在解析时展开。我看到当不使用延迟扩展选项时,
    %ERRORLEVEL%
    值被损坏。阅读本文了解更多信息。

    处理批处理文件确实是一件痛苦的事情(DOS批处理文件使bash脚本看起来很棒,而bash很糟糕!)。问题可能来自批处理文件处理变量扩展的方式。这里有一些东西可以尝试:

  • 将以下行添加到批处理脚本的顶部(我通常将其放在顶部,就在我的
    @echo off
    行下方):
    setlocal enabledelayedexpansion
  • 将所有
    %ERRORLEVEL%
    引用更改为
    !错误等级代替(感叹号代替百分号)

  • 这些更改将导致变量在执行时展开,而不是在解析时展开。我看到当不使用延迟扩展选项时,
    %ERRORLEVEL%
    值被损坏。阅读本文了解更多信息。

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

    perl-ssutexec.pl-prog=MyProg…

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

    您的文件关联可能在那里,但您的脚本可能仍然会因为错误而失败

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

    测试蝙蝠

    @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
    

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

    perl-ssutexec.pl-prog=MyProg…

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

    您的文件关联可能在那里,但您的脚本可能仍然会因为错误而失败

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

    测试蝙蝠

    @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
    

    您确定在Perl脚本中将
    $status
    设置为非零值吗?@Jonah…是的,代码中的Print语句打印出的值为44@MikeTWebb在最后两个系统()之后,$status的值是多少在退出之前调用?您确定在Perl脚本中将
    $status
    设置为非零值吗?@Jonah…是的,代码中的Print语句打印出的值为44@MikeTWebb在最后两个系统()之后,$status的值是多少就在出口前打电话?@Jonah…我明天还会让你尝试一下,然后公布结果。也谢谢你@乔纳…我试过了,但我的场景仍然看不到效果!错误等级!嗯。还有一件事要尝试。。。尝试将你的条件用引号括起来:
    如果不是“%status%”==“0”
    @Jonah…我也会在明天给你一个尝试的方法,并发布结果。也谢谢你@乔纳…我试过了,但我的场景仍然看不到效果!错误等级!嗯。还有一件事要尝试。。。请尝试将条件用引号括起来:
    如果不是“%status%”==“0”
    pragma可以对代码进行一系列安全检查。鼓励在生产环境中使用it。不过,如果你的剧本一开始就被卡住了,不要感到惊讶;它不是无缘无故地被称为“严格的”。@Craig……我尝试了上面的场景,它使用的是由perl调用的test.pl,而不使用。Andy ideas?pragma允许对代码进行一系列安全检查。鼓励在生产环境中使用it。不过,如果你的剧本一开始就被卡住了,不要感到惊讶;它不是无缘无故地被称为“严格的”。@Craig……我尝试了上面的场景,它使用的是由perl调用的test.pl,而不使用。安迪的想法?