Как получить вывод команды Win32 :: Process в Perl? - PullRequest
2 голосов
/ 03 апреля 2010

Я использую use Win32::Process для запуска приложения, как показано ниже. Он работает нормально, но у меня не было никакого способа получить вывод в файл .txt.

Я использовал NORMAL_PRIORITY_CLASS, а не CREATE_NEW_CONSOLE, чтобы получить вывод на том же терминале, но я не знаю, как перенаправить его в текстовый файл.

/ каменистый

#!/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 ]

5 голосов
/ 04 апреля 2010

Win32 :: Process - это один из тех модулей, который по сути является прямым портом Win32 API в Perl и, таким образом, не имеет большого смысла для программиста на Perl. Если вы не хотите делать что-то очень специфичное для Windows, есть лучшие способы сделать это.

Если все, что вам нужно, - это получить выходные данные процесса, вы можете просто запустить его обычным способом с помощью обратных символов Perl.

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

Если вы хотите получить фантазию, например, для создания фона процесса и захвата его вывода, я бы порекомендовал IPC :: Run .

1 голос
/ 04 апреля 2010

С perlfaq8 :

Backticks (``) запускает команду и возвращает то, что она отправила в STDOUT.

Более подробную информацию можно найти в perlop .

0 голосов
/ 13 августа 2017

Этого можно добиться с помощью Win32 :: Process, перенаправив STDOUT и STDERR в текстовый файл.

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 (как в примере выше), чтобы гарантировать, что вызываемый процесс наследует дескрипторы / console вызывающих процессов. Значения этих флагов можно найти в документации Win32 :: Process и Microsoft Windows:

Win32 :: Процесс CPAN

Флаги создания процессов в Microsoft Windows

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...