大家好我需要捕获外部命令的输出,因此我使用反引号。 但是,当命令到达换行符时,将省略输出。其中$ _ = AD
@lines = `"C:/Program Files/Veritas/NetBackup/bin/admincmd/bppllist" $_ -U"`
Test: test1 Test: test2 Test: test3 Test: test4
实际输出: @lines
Test: test1 Test: 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
答案 0 :(得分:1)
以下是如何捕捉STDOUT&amp;使用反引号生成进程的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
技巧会在那里发挥作用。
答案 1 :(得分:1)
不要使用qx
或反引号然后使用shell命令来重定向输出,而是尝试使用核心模块IPC::Cmd。特别是,它的可导出函数&run
将方便地为您捕获STDOUT和STDERR。从概要:
### in list context ###
my( $success, $error_message, $full_buf, $stdout_buf, $stderr_buf ) =
run( command => $cmd, verbose => 0 );
答案 2 :(得分:0)
也许命令将其输出发送到stderr。
试试这个:
my $output = `'command' -ARG -L 2>&1`;
的问候,