【问题标题】:perl program to handle return of batch fileperl 程序处理批处理文件的返回
【发布时间】:2014-03-17 17:29:15
【问题描述】:

我正在尝试从 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”,因为输出是成功的。请求更正我的代码或建议我处理这个问题的最佳方法。

【问题讨论】:

  • 所以你回显failed 并且在exit 1 之后你的$output 中有零?这是完整的批处理文件吗?
  • 是的,它是完整的文件批处理。我在此处发布之前删除了不必要的代码
  • 问题出在批处理脚本中。 perl -e "print map { system(qq{cmd /c exit $_}) >>8 } (0,1)"

标签: perl batch-file


【解决方案1】:

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

Perl 部分很好。如果你总是得到一个0,那肯定是批处理脚本在起作用。或者Java。 如果您想检查 Perl 中的返回值是否为零,则必须将其右移 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?

【讨论】:

  • 但在失败的情况下,我得到的响应为 0。这不是我们想要的。
  • @user3274878:嗯,您是否还从批处理文件中看到控制台上的failed?如果您从命令行执行批处理文件并使用echo Exit Code is %errorlevel% 跟随它,如果失败,这会给您 1 还是 0?
  • 是的,它在控制台上打印“失败”。对于 echo %errorlevel% 它始终为 1,因为它是在 windows 中作为环境变量创建的
  • @user3274878 那我帮不了你了。您发布的 perl 部分可以正常工作,并且大致按照您的想法进行。如果在system() 中调用的脚本返回1,则$output >> 8 为1。这意味着$output 不为零。如果它对您不起作用,那么它与批处理部分或您的窗口神奇地改变退出代码有关。也许删除errorlevel 进行测试。
  • 嗨,我终于明白了。我需要删除一个我创建的 %ERRORLEVEL% 设置为 1 的 ENV 变量,删除后我得到了所需的输出....
【解决方案2】:

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

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

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

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

【讨论】:

  • 看来 Op 实际上想要检查退出代码。当然,作为替代方案,他们可以使用反引号并检查回显的内容。
  • 您好,感谢您的回复!现在用你的代码替换后,没有从批处理文件中得到任何输出:(。请帮助
猜你喜欢
  • 2013-01-07
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
  • 2023-03-11
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多