Этого можно добиться с помощью 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