我正在使用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() );
}
答案 0 :(得分:5)
Win32 :: Process是其中一个模块,它基本上是Perl的Win32 API的直接端口,因此对Perl程序员来说没什么意义。除非你想做一些特定于Windows的事情,否则有更好的方法可以做到。
如果你只想获得一个进程的输出,你可以使用Perl的反引号正常运行它。
my $output = `iperf.exe -u -s -p 5001`;
如果你想获得幻想,例如背景化流程并捕获其输出,我建议IPC::Run。
答案 1 :(得分:1)
答案 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文档中找到: