我在使用Win32 :: Process的Perl腳本中運行一個命令,並且我需要將該命令的輸出重定向到一個文本文件。在做了一些研究後,這就是我正在嘗試的:如何將Win32 :: Process命令的輸出重定向到文本文件?
use Win32::Process;
open (OLDOUT, ">&STDOUT");
open (OLDERR, ">&STDERR");
my $file = "output.txt";
open (STDOUT, ">$file");
open (STDERR, ">&STDOUT");
my $timeout = 1000 * 60; # 60 second timeout
my $proc;
my $exit;
my $exe = "C:/Windows/System32/cmd.exe";
Win32::Process::Create($proc, $exe, "echo hello from process", 1, DETACHED_PROCESS, ".");
$proc->Wait($timeout);
$proc->GetExitCode($exit);
system("echo hello from system"); # To verify that the redirect is working
close (STDOUT);
close (STDERR);
open (STDOUT, ">&OLDOUT");
open (STDERR, ">&OLDERR");
close (OLDOUT);
close (OLDERR);
不幸的是,這是行不通的。在output.txt文件中,我只收到「hello from system」。有沒有辦法用Win32 :: Process完成我想要的功能?
我使用Win32 :: Process而不是反引號的原因是因爲我的命令有時會崩潰,並且我需要提供超時以便在必要時終止它。 Win32 :: Process的 - > Wait()函數允許我這樣做。
我寧願有一個使用Win32 :: Process的解決方案,因爲我受限於我有權訪問哪些模塊。但是,如果真的不能這樣做,我會歡迎使用其他模塊的示例解決方案。
謝謝。
謝謝您的解決方案。我已經用$ exe = which'gnatmake'來測試它,命令被替換爲「gnatmake -v」,並且輸出被正確寫入output.txt。我也刪除了分叉進程,因爲我相信這是不必要的。看起來我的真正問題是使用echo命令,因爲我仍然無法使用它。但是因爲我只是用它來測試,所以我不在乎。 – epsilonjon
我已經測試過這個,它工作完美。感謝您的幫助。 – epsilonjon