2010-04-03 2 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의 직선 포트의 그 모듈 중 하나이며, 따라서 펄 프로그래머 거의 의미가 있습니다. 매우 Windows 특유의 것을하고 싶지 않다면, 그것을하는 더 좋은 방법이 있습니다.

프로세스의 출력을 얻고 싶다면 Perl의 백틱을 사용하여 정상적으로 실행할 수 있습니다. 당신은 예를 들어 프로세스를 배경 처리 및 출력을 캡처, 공상 얻고 싶은 경우에

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

, 나는 IPC::Run을 권 해드립니다. perlfaq8에서

1

:

역 따옴표 (``) 명령을 실행하고 STDOUT로 전송 무엇 돌아갑니다.

자세한 내용은 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에서 :: 과정 :: 전화를 만들기가 생성 된 프로세스 핸들을 호출 프로세스를 상속하기 위해 (위의 예에서와 같이) $ iflags를 설정하는 것이 중요 제대로 $ CFLAGS/콘솔. 이러한 플래그의 의미는 Win32에서에서 찾을 수 있습니다 : 프로세스 및 Microsoft Windows 설명서 :

Win32::Process CPAN

Microsoft Windows process creation flags

관련 문제