如何在Perl中获取Win32 :: Process命令的输出?

时间:2010-04-03 18:26:19

标签: windows perl

我正在使用use Win32::Process来运行我的应用程序,如下所示。它运行正常,但我没有办法将输出转换为.txt文件。

我使用NORMAL_PRIORITY_CLASS而不是CREATE_NEW_CONSOLE来获取同一终端本身的输出,但我不知道如何将其重定向到txt文件。

/岩石

#!/usr/bin/perl

use strict;
use warnings;
use Win32::Process;

Win32::Process::Create(my $ProcessObj,
                       "iperf.exe",
                       "iperf.exe -u -s -p 5001",
                       0,
            NORMAL_PRIORITY_CLASS,
                       ".") || die ErrorReport();
my @command_output;

push @command_output,$ProcessObj;

open FILE, ">zz.txt" or die $!;
print FILE @command_output;
close FILE;

sleep 10;
$ProcessObj->Kill(0);

sub ErrorReport{
    print Win32::FormatMessage( Win32::GetLastError() );
}

3 个答案:

答案 0 :(得分:5)

Win32 :: Process是其中一个模块,它基本上是Perl的Win32 API的直接端口,因此对Perl程序员来说没什么意义。除非你想做一些特定于Windows的事情,否则有更好的方法可以做到。

如果你只想获得一个进程的输出,你可以使用Perl的反引号正常运行它。

my $output = `iperf.exe -u -s -p 5001`;

如果你想获得幻想,例如背景化流程并捕获其输出,我建议IPC::Run

答案 1 :(得分:1)

来自perlfaq8

  

反引号(``)运行命令并返回发送给STDOUT的内容。

更多详细信息,请参阅perlop

答案 2 :(得分:0)

您可以通过将STDOUT和STDERR重定向到文本文件来使用Win32 :: Process实现此目的。

use strict;
use warnings;

use File::Which qw(which);
use Win32;
use Win32::Process;

# Back up STDOUT and STDERR to OLDOUT and OLDERR
open (OLDOUT, ">&STDOUT");
open (OLDERR, ">&STDERR");

# Redirect STDOUT and STDERR to text file
my $file = "output.txt";
open (STDOUT, ">$file");
open (STDERR, ">&STDOUT");

# Create process
my $timeout = 60000 * 10; # 10 minute timeout
my ($process, $exitCode);
my $exe = which 'iperf';
Win32::Process::Create($process, $exe, "iperf.exe -u -s -p 5001", 1, 0, ".");
$process->Wait($timeout);
$process->GetExitCode($exitCode);
print "Spawned process exited with $exitCode\n";

# Restore STDOUT and STDERR
close (STDOUT);
close (STDERR);
open (STDOUT, ">&OLDOUT");
open (STDERR, ">&OLDERR");
close (OLDOUT);
close (OLDERR);

请注意,在Win32 :: Process :: Create调用中,正确设置$ iflags和$ cflags非常重要(如上例所示),以确保生成的进程继承调用进程句柄/控制台。这些标志的含义可以在Win32 :: Process和Microsoft Windows文档中找到:

Win32::Process CPAN

Microsoft Windows process creation flags