DOS批处理文件中的Perl脚本返回值
我有一个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
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,而不使用。安迪的想法?