2009-05-28 20 views
28

Primero un poco de fondo.Capturar la salida EXE en PowerShell

Me han encomendado encriptar archivos con un script de Powershell usando GPG (gnupg.org). El exe específico que estoy llamando es simplemente gpg.exe. Me gustaría capturar la salida cada vez que ejecuto un comando.

Por ejemplo, me importa una clave pública en PowerShell de la siguiente manera:

& $gpgLocation --import "key.txt" 

$ gpgLocation es simplemente la ubicación del archivo de gpg.exe (por defecto es "C: \ Archivos de programa \ GNU \ GnuPG \ gpg .exe"

toda Mi problema aquí es que si lo intento:

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

Todo lo que consigo es un archivo de 1 kb, apropiadamente llamado, pero es completamente en blanco he intentado varias banderas tanto para exterior. archivo solo para ver si me encontraba con un capricho

También he intentado enviar el comando para el código (y la captura de la salida con el habitual fuera de archivos, 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(); 

¿Alguna idea? ¡Estoy desesperado!

+0

+1 para el último fragmento de código, lo que anula la funcionalidad por defecto Puesta en proceso de cualquiera de comer hasta la llamada de salida del proceso, o escribir en un archivo (pero no a la salida estándar) –

Respuesta

32

¿El resultado que espera es estándar-error o estándar?

hace esto?

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

Parece que el 2 $ 1 ' ¡¡¡¡trabajos!!!! Sinceramente aprecio a todos ustedes que se tomaron su tiempo para ver esto !! ¡Lo digo en serio! – CLR

+2

Otro buen consejo es que, al usar esto, cualquier salida de stderr estará envuelta en objetos ErrorRecord. Para que pueda manejar fácilmente el resultado de error si lo desea. – JasonMArcher

3

Además, PowerShell simplemente no puede capturar la salida de algunos programas porque no escriben en stdout. Puede verificar esto ejecutando el programa en PowerShell ISE (está en la versión 2.0 CTP 3)

Si PowerShell ISE no puede mostrar el resultado en la consola gráfica, entonces tampoco puede capturarlo y puede necesitar algunos otra forma de automatizar el programa.

+2

GPG ciertamente no manipulará directamente el búfer de la pantalla de la consola.O, al menos, me parece muy improbable que un programa UNIX que solo necesita algo de salida moleste con maldiciones. – Joey

+0

Mostrar el error en mi situación afortunadamente no fue un problema, solo capturarlo. Sin embargo, pensé en este mismo problema, ya que supuse que no todas las aplicaciones iban a hacer lo mismo en lo que respecta a la salida de la consola. – CLR

3

Es necesario utilizar el interruptor --batch al automatizar gpg.exe, como en:

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

Sin ese interruptor, GPG puede estar esperando la entrada del usuario.

+0

En mi situación no es así, pero eso es un buen consejo. Tengo otro lugar que puedo utilizar - lote. – CLR

6

También puede usar Out-Host como se muestra a continuación.

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

La respuesta de Stobor es genial. Estoy agregando a su respuesta porque necesitaba realizar acciones adicionales si el exe tenía un error.

También puede almacenar la salida del archivo exe en una variable como esta. Entonces puede hacer un manejo de errores basado en el resultado del 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 
Cuestiones relacionadas