usar tutorial script como commands comandos powershell

tutorial - Capture la salida EXE en PowerShell



powershell tutorial (5)

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

¿Esto funciona?

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

Un poco de fondo primero.

Me encargaron 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, importo 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"

Todo mi problema aquí es que si intento:

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

Todo lo que obtengo es un archivo de 1 KB, con el nombre apropiado, pero está COMPLETAMENTE en blanco. He intentado varias banderas para fuera de archivo solo para ver si me encuentro con un capricho.

También intenté enviar el comando a este código (y capturar el resultado con el habitual archivo externo, 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();

¿Algunas ideas? ¡Estoy desesperado!


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, tampoco podrá capturarlo y es posible que necesite alguna otra forma de automatizar el programa.


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 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


Necesitará usar el conmutador --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.


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

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