1

大家好,我需要捕获外部命令的输出,因此我使用反引号。但是,当命令到达换行符时,将省略输出。其中 $_ = AD

@lines = `"C:/Program Files/Veritas/NetBackup/bin/admincmd/bppllist" $_ -U"`
测试:test1
测试:test2

测试:test3
测试:test4

实际输出:@lines

测试:test1
测试:test2

感谢您的时间。

    print HTML "<h2 id='pol'>Policy Configuration\n</h2>" ;

  @bpllist =`"$admincmd/bppllist.exe"` or die print "$admincmd/bppllist.exe not found or could not be executed";
foreach (@bpllist) 
{
  print HTML "<div><table class='table'>\n";
  @lines = `"$admincmd/bppllist" $_ -U` or die print       "$admincmd/bpplinfo $_ -U not found or could not be executed";
   print HTML "\t<tr>\n\t<td><b>Policy name: <b></td><td>$_</td>\n\t</tr>\n" ;

  foreach (@lines) {

chop;
 ($var, $value) = split(/:/,$_,2);
 $var = "" if !defined($var);
 $value = "" if !defined($value);
print HTML "\t<tr>\n\t<td>$var</td><td>$value</td>\n\t</tr>\n" ;

  } 
  print HTML "</table></div>";
  }

@bpllist 的输出:

  AD
  Sharepoint
  Echchange
  Vmware
4

3 回答 3

1

以下是使用反引号捕获衍生进程的 STDOUT 和 STDERR 的方法:

my $output = join('', `command arg1 arg2 arg3 2>&1`);

它的工作方式不依赖于输出中的换行符command

如果您还需要向command的 STDIN 发送文本,请使用 IPC::Open3。


稍微清理一下你的代码。这个对我有用。

use strict;
use warnings;
use 5.10.0;

# something missing here to set up HTML file handle
# something missing here to set up $admincmd

print HTML q{<h2 id='pol'>Policy Configuration\n</h2>};
my @bpllist = `"$admincmd/bppllist.exe"` 
  or die "$admincmd/bppllist.exe not found or could not be executed\n";
for my $policy (@bpllist) {
  print HTML q{<div><table class='table'>\n};
  my @lines = `$admincmd/bpplinfo.exe $policy -U 2>&1`;
  print HTML qq{\t<tr>\n\t<td><b>Policy name: <b></td><td>$policy</td>\n\t</tr>\n} ;
  for my $pair (@lines) {
    chomp($pair); # only remove newlines, not other characters
    my ($var, $value) = split /:/, $pair, 2;
    $var //= '';
    $value //= '';
    print HTML qq{\t<tr>\n\t<td>$var</td><td>$value</td>\n\t</tr>\n} ;
  }
  print HTML q{</table></div>};
}

更新 2

您似乎在 Windows 上执行此操作?

我不认为这个2>&1技巧会在那里奏效。

于 2012-04-06T07:14:41.047 回答
1

尝试使用核心模块IPC::Cmd ,而不是使用qx或反引号,然后使用 shell 命令来重定向输出。特别是,它的可导出功能将为您方便地捕获 STDOUT 和 STDERR。来自简介:&run

### in list context ###
my( $success, $error_message, $full_buf, $stdout_buf, $stderr_buf ) =
run( command => $cmd, verbose => 0 );
于 2012-04-06T08:02:11.017 回答
0

也许该命令将其输出发送到 stderr。

尝试这个:

my $output = `'command' -ARG -L 2>&1`;

问候,

于 2012-04-06T07:44:12.623 回答