2009-05-28 5 views
28

작은 배경을 먼저 사용하십시오.PowerShell에서 EXE 출력 캡처

저는 GPG (gnupg.org)를 사용하여 Powershell 스크립트로 파일을 암호화하는 임무를 맡았습니다. 내가 호출하는 특정 exe는 gpg.exe입니다. 명령을 실행할 때마다 출력을 캡처하고 싶습니다. 다음과 같이

는 예를 들어, 내가 PowerShell에서 공개 키를 가져옵니다

& $gpgLocation --import "key.txt" 

$ gpgLocation 단순히 gpg.exe의 파일 위치 (기본값은 "인 C : \ 프로그램 파일 \ GNU \ GnuPG는 \ GPG

& $gpgLocation --import "key.txt" | out-file gpgout.txt 

내가 할 모든 적절라는 1킬로바이트 파일이지만, 완전히 비어 내가 OUT-에 대한 몇 가지 플래그를 시도했다 : .EXE는 "

여기 내 전체 문제는 나는 것을 시도하는 경우. 보기 만하는 파일 내가 버릇에 빠지면.

param 
(
    [string] $processname, 
    [string] $arguments 
) 

$processStartInfo = New-Object System.Diagnostics.ProcessStartInfo; 
$processStartInfo.FileName = $processname; 
$processStartInfo.WorkingDirectory = (Get-Location).Path; 
if($arguments) { $processStartInfo.Arguments = $arguments } 
$processStartInfo.UseShellExecute = $false; 
$processStartInfo.RedirectStandardOutput = $true; 

$process = [System.Diagnostics.Process]::Start($processStartInfo); 
$process.WaitForExit(); 
$process.StandardOutput.ReadToEnd(); 

어떤 아이디어 :

나는이 코드에 명령을 전송 (그리고 보통 아웃 파일 등으로 출력을 캡처) 시도했습니다? 나는 필사적이다!

+0

+1 중 (그러나 표준 출력) –

답변

32

예상되는 출력이 표준 오류 또는 표준 출력으로 이동합니까?

이 방법이 효과가 있습니까?

& $gpgLocation --import "key.txt" 2>&1 | out-file gpgout.txt 
+1

모습 호출 된 프로세스 출력을 먹고, 또는 파일에 쓰기 2 $ 1 ' 공장!!!! 나는 진심으로이 모든 것을 보아 주셔서 감사합니다! 진심이야! – CLR

+2

또 다른 좋은 팁은 이것을 사용할 때 stderr의 모든 출력이 ErrorRecord 객체에 래핑된다는 것입니다. 원하는 경우 오류 출력을 쉽게 처리 할 수 ​​있습니다. – JasonMArcher

3

또한 PowerShell은 stdout에 쓰지 않기 때문에 일부 프로그램의 출력을 캡처 할 수 없습니다. PowerShell ISE에서 프로그램을 실행하여 확인할 수 있습니다 (버전 2.0 CTP 3에 있음)

PowerShell ISE에서 그래픽 콘솔에 출력을 표시 할 수 없으면 캡처 할 수 없으며 일부는 필요할 수도 있습니다 프로그램을 자동화하는 다른 방법.

& $gpgLocation --import "key.txt" --batch | out-file gpgout.txt 

을 전환 한하지 않고, GPG는 사용자 입력을 기다리고있을 수 있습니다 같이 GPG.EXE을 자동화 할 때

+2

GPG는 확실히 콘솔 화면 버퍼를 직접 조작하지 않습니다.또는, 최소한 나는 유닉스 프로그램이 단지 약간의 결과물을 필요로하는 것은 저주로 고생 할 것 같지 않다는 것을 매우 발견했다. – Joey

+0

내 상황에서 오류를 표시하는 것은 다행히도 문제가 아니 었습니다. 그러나 콘솔 출력에 관해서 모든 애플 리케이션이 똑같은 일을 할 것이라고 가정 할 때 나는이 같은 문제에 대해 생각했다. – CLR

3

당신은 --batch 스위치를 사용해야합니다.

+0

내 상황에서는 그렇지 않지만 좋은 팁입니다. 나는 내가 사용할 수있는 또 다른 자리를 가지고있다 - 배치. – CLR

6

다음과 같이 Out-Host를 사용할 수도 있습니다.

& $gpgLocation --import "key.txt" | Out-Host 
6

스 토어의 대답은 훌륭합니다. exe에 오류가있는 경우 추가 작업을 수행해야하므로 그의 답변에 추가됩니다.

exe의 출력을 이와 같은 변수에 저장할 수도 있습니다. 그럼 당신은 exe의 결과에 따라 오류 처리를 할 수 있습니다. 의 기본 시작 - 프로세스 기능을 무시 마지막 코드에 대한

$out = $gpgLocation --import "key.txt" 2>&1 
if($out -is [System.Management.Automation.ErrorRecord]) { 
    # email or some other action here 
    Send-MailMessage -to [email protected] -subject "Error in gpg " -body "Error:`n$out" -from [email protected] -smtpserver smtp.example.com 
} 
$out | out-file gpgout.txt 
관련 문제