2009-05-28 10 views
28

Ein wenig Hintergrund zuerst.Capture EXE-Ausgabe in PowerShell

Ich wurde beauftragt, Dateien mit einem Powershell-Skript mit GPG (gnupg.org) zu verschlüsseln. Die spezifische exe, die ich anrufe, ist einfach gpg.exe. Ich möchte die Ausgabe immer erfassen, wenn ich einen Befehl ausführe.

So importieren ich einen öffentlichen Schlüssel in Powershell wie folgt:

& $gpgLocation --import "key.txt" 

$ gpgLocation ist einfach der Speicherort der Datei von gpg.exe (default „C sein: \ Programme \ GNU \ GnuPG \ gpg .exe“

Mein hier ganze Problem ist, dass, wenn ich versuche:

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

Alles, was ich bekommen, ist eine 1 kb-Datei, entsprechend benannt, aber es ist völlig leer ich für out- mehrere Fahnen ausprobiert habe. Datei nur um zu sehen wenn ich in eine Eigenart geraten würde.

Ich habe auch versucht, zu diesem Code, um den Befehl zu senden (und die Ausgabe mit der üblichen out-Datei erfassen etc.):

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

Irgendwelche Ideen? Ich bin verzweifelt!

+0

+1 für den letzten Code-Schnipsel, die Startprozess Funktionalität von Standardüberschreibt entweder den genannten Prozessausgang zu essen, oder in eine Datei (aber nicht auf der Standardausgabe) Schreiben –

Antwort

32

Erwartet die Ausgabe, die Sie erwarten, Standardfehler oder Standardausgabe?

funktioniert das?

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

Sieht aus wie der 2> $ 1 funktioniert !!!! Ich schätze aufrichtig all die Leute, die sich die Zeit genommen haben, sich das anzusehen !! Ich meine es so! – CLR

+2

Ein weiterer guter Tipp ist, dass bei der Verwendung dieser Ausgabe alle Ausgaben von stderr in ErrorRecord-Objekte eingeschlossen werden. So können Sie die Fehlerausgabe problemlos handhaben, wenn Sie möchten. – JasonMArcher

3

Außerdem kann PowerShell die Ausgabe einiger Programme nicht erfassen, da sie nicht in stdout schreiben. Sie können dies überprüfen, indem Sie das Programm in PowerShell ISE ausführen (es ist in der Version 2.0 CTP 3)

Wenn PowerShell ISE die Ausgabe nicht in der grafischen Konsole anzeigen kann, dann können Sie es auch nicht erfassen und benötigen möglicherweise einige andere Art der Automatisierung des Programms.

+2

GPG wird den Konsolenbildschirmpuffer nicht direkt manipulieren.Oder zumindest würde ich es als unwahrscheinlich empfinden, dass ein UNIX-Programm, das nur etwas Ausgabe benötigt, sich mit Flüchen befassen würde. – Joey

+0

Den Fehler in meiner Situation anzuzeigen, war zum Glück kein Problem, es einfach zu erfassen. Ich habe jedoch über das gleiche Problem nachgedacht, da ich davon ausgegangen bin, dass nicht alle Apps dasselbe tun, wenn es um die Konsolenausgabe geht. – CLR

3

Sie müssen den --batch Schalter verwenden, wenn gpg.exe automatisieren, wie in:

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

Ohne diesen Schalter kann GPG für Benutzereingaben warten.

+0

In meiner Situation ist es nicht, aber das ist ein guter Tipp. Ich habe noch einen Platz, den ich nutzen kann --batch. – CLR

6

Sie können den Out-Host auch wie unten gezeigt verwenden.

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

Stobors Antwort ist großartig. Ich füge zu seiner Antwort hinzu, weil ich zusätzliche Aktionen ausführen musste, wenn die Exe einen Fehler hatte.

Sie können die Ausgabe der exe auch in eine Variable wie diese speichern. Dann können Sie die Fehlerbehandlung basierend auf dem Ergebnis der EXE durchführen.

$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