2009-05-28 20 views
28

Önce biraz arka plan.PowerShell'de EXE çıktısı yakala

GPG (gnupg.org) kullanarak bir Powershell komut dosyasıyla dosyaları şifreleme ile görevlendirildim. Ben arıyorum belirli exe sadece gpg.exe. Bir komutu ne zaman çalıştırdığımda çıktıyı yakalamak istiyorum. aşağıdaki gibi

Mesela ben powershell Bir açık anahtar:

& $gpgLocation --import "key.txt" 

$ gpgLocation basitçe gpg.exe dosya konumu (varsayılan "olma C: \ Program Files \ GNU \ GNUPG \ gpg

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

ı get uygun adında bir 1kb dosyası, ama TAMAMEN boştur Ben ayaktan için çeşitli bayrakları denedim: .exe"

Buradaki tüm mesele bunu deneyin eğer. sadece görmek için dosya eğer bir tuhaflık yapıyor olsaydım.

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(); 

Herhangi fikirler:

Ben de bu koda komutu gönderme (ve her zamanki dışı dosyası vb ile çıkış yakalayan) denedim? Çaresizim!

+0

+1 ya (ancak standart çıkışa) –

cevap

32

Beklediğiniz çıktı standart hataya mı yoksa standart çıkışa mı gidiyor?

bu işe yarar mı?

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

benziyor denilen süreç çıktısını harcamadan ya da bir dosyaya yazma 2> $ 1 Eserleri!!!! Buna bakmak için zaman harcanan herkese içtenlikle teşekkür ederim! İçtenlikle söyledim! – CLR

+2

Bir başka iyi ipucu, bunu kullanırken, stderr'deki herhangi bir çıktının ErrorRecord nesnelerine sarılmasıdır. Böylece isterseniz hata çıkışını kolaylıkla kullanabilirsiniz. – JasonMArcher

3

Ayrıca, PowerShell, bazı programların çıktılarını yakalayamaz, çünkü bunlar stdout'a yazmazlar. PowerShell ISE'de (bu sürüm 2.0 CTP 3'tür) programı çalıştırarak bunu doğrulayabilirsiniz. PowerShell ISE, çıktıyı grafik konsolunda gösteremiyorsa, bunu yakalayamazsınız ve bazılarına ihtiyaç duyabilirsiniz. programı otomatikleştirme yolu.

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

o anahtar olmadan, GPG kullanıcı girişi bekliyor olabilir: olduğu gibi GPG.EXE otomasyonu zaman

+2

GPG kesinlikle konsol ekran arabelleğini doğrudan işlemez.Ya da en azından, bir çıktıya ihtiyaç duyan bir UNIX programının küfürlerle uğraşacağını ummak istemiyorum. – Joey

+0

Durumumdaki hatayı göstermek neyse ki sorun değil, sadece onu yakalamaktı. Ben de aynı sorun hakkında düşünmüştüm, çünkü tüm uygulamalar konsol çıkışı söz konusu olduğunda aynı şeyi yapmayacaktı. – CLR

3

Sen --batch anahtarını kullanmanız gerekir.

+0

Benim durumumda değil, ama bu iyi bir ipucu olsa da. Kullanabileceğim başka bir nokta var --batch. – CLR

6

Ayrıca aşağıda gösterildiği gibi Out-Host'u kullanabilirsiniz.

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

Stobor'un cevabı harikadır. Ben onun cevabını ekliyorum çünkü exe bir hata varsa ek eylemler gerçekleştirmek gerekiyordu.

Ayrıca, exe'nin çıktısını bunun gibi bir değişkene de kaydedebilirsiniz. Sonra exe sonucuna göre hata işleme yapabilirsiniz. varsayılan Başlat-Süreç işlevselliğini geçersiz kılan, son kod parçacığı için

$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