2010-04-03 68 views
2

我使用use Win32::Process爲我的應用程序運行如下。它運行良好,但我沒有得到任何方式來獲得輸出到.txt文件。如何在Perl中獲得Win32 :: Process命令的輸出?

我用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()); 
} 

回答

5

的Win32 ::過程是這基本上在Win32 API成的Perl的直線端口這些模塊中的一個,並且因此使得毫無意義的一個Perl程序員。除非你想做一些特定於Windows的東西,否則有更好的方法去做。

如果你只想得到一個進程的輸出,你可以使用Perl的反引號來正常運行它。

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

如果你想獲得幻想,例如backgrounding的過程並捕獲它的輸出,我建議IPC::Run

1

perlfaq8

反引號(``)運行命令,並返回它發送到標準輸出。

更多細節可在perlop找到。

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 ::過程:: Create調用,它設置$ iflags是重要的,正確的$ CFLAGS(如上面的例子),以確保衍生的進程繼承調用過程中處理/安慰。這些標誌的含義可以在Win32中找到::過程與Microsoft Windows文檔:

Win32::Process CPAN

Microsoft Windows process creation flags

相關問題