用于处理批处理文件返回的perl程序

时间:2014-02-18 06:11:38

标签: perl batch-file

我正在尝试从perl脚本运行批处理文件,但我无法处理批处理文件的返回。下面是我的代码

perl脚本:

// call a batch file 
        my $output =system("D:\\WORKSPACE\\CC_Triggers\\batch_file.bat");
// based on output check the status of the batch file
        if($output==0){
        print "success in trigger**********";
        }
        else
        {
        print "FAilure**********";
        }

批处理文件:

set "java_output="
setlocal enableDelayedExpansion
//this will call a java program and get return value.
for /f "delims=" %%J in ('java -cp "PMDfileRead.jar;jxl.jar" PMDfileRead') do (
      set "java_output=!java_output! %%J" 
)
endlocal & set java_output=%java_output%

// check the ouput of java and act accordingly
IF %java_output% == 1 (
echo failed
exit(1);
)else (
echo succeeded
)

基本上我正在尝试验证xls文件并从java代码返回标志,这是由批处理文件调用的,而且我需要返回到我无法获得的perl脚本。在成功和失败的情况下,由于输出成功,我输出为“0”。请求更正我的代码或建议我处理此问题的最佳方法。

2 个答案:

答案 0 :(得分:0)

用反引号替换你的system()调用:

system()包装调用返回命令的退出状态,而使用``返回实际的STDOUT(即你的echo语句)

欲了解更多信息: What's the difference between Perl's backticks, system, and exec?

即: my $ output =`D:\ WORKSPACE \ CC_Triggers \ batch_file.bat`;

答案 1 :(得分:0)

编辑:对不起,我以某种方式读过mpapec发表的评论,说明同样的事情。

Perl部分很好。如果您总是得到0,则必须是批处理脚本。或者Java。 如果你想检查Perl中的返回值除了它是否为0之外的任何东西,那么你必须将它向右移8位。

my $output = (system("D:\\WORKSPACE\\CC_Triggers\\batch_file.bat")) >> 8;

但是因为你只检查是否为零,这不应该是一个问题。

编辑: 在使用Windows时,永远不要定义环境变量ERRORLEVEL,因为它会与应用程序返回的实际退出代码混淆。这在这里有更详细的解释:How do I get the application exit code from a Windows command line?