2012-09-21 6 views
8

La consola de PowerShell y el ISE de PowerShell se comportan de manera diferente cuando los ejecutables escriben en la secuencia de error estándar (stderr). La consola (powershell.exe) lo muestra como salida estándar. Por ejemplo, cuando llego a un estado con Mercurial en un no-repositorio, se escribe en el error estándar:Indicar a PowerShell ISE que no envíe stderr a Write-Error

> hg st -R C:\Windows 
abort: repository C:\Windows not found! 

Sin embargo, en el PowerShell ISE (powershell_ise.exe), que el error se pasa a Write-Error cmdlet de PowerShell:

> hg st -R C:\Windows 
hg.exe : abort: repository C:\Windows not found! 
At line:1 char:3 
+ hg <<<< st -R C:\Windows 
    + CategoryInfo   : NotSpecified: (abort: repository C:\Windows not found!:String) [], RemoteExcepti 
    on 
    + FullyQualifiedErrorId : NativeCommandError 

¿Hay alguna manera de configurar el ISE para que se comporte como la consola y no envíe la corriente stderr a Write-Error?

+0

Lo que estoy viendo actualmente con mi Powershell 4 en Win7 es que: PowerShell-Console e ISE se comportan de la manera descrita, * pero * cuando se ejecuta un script powershell '.ps1' desde la consola, o cuando invocando 'powershell script.ps1'from eg una ventana de cmd normal, entonces la corriente de stderr se comportará como en ISE, es decir, usar Write-Error. –

Respuesta

1
hg st -R C:\Windows 2>&1 | %{ if ($_ -is [System.Management.Automation.ErrorRecord]) { $_.Exception.Message } else { $_ } } 

Esto conserva la salida de stderr y la envía como salida normal, en lugar de soltarla.

7

Redirigir la salida de stderr a stdout "debería" funcionar, pero no en ISE. En este caso, lo mejor es silenciar la salida de error de este modo:

& { 
    $ErrorActionPreference = 'SilentlyContinue' 
    hg st -R C:\Windows 2>&1 
} 

Ejecutando el establecimiento de esta variable en un ámbito anidado, se evita que el establecimiento a nivel mundial. Cuando se sale del alcance anterior, la versión global de $ErrorActionPreference sigue configurada como lo que era antes.

Es desafortunado que ISE y la consola se comportan de manera diferente, pero tengo entendido que con la "consola", otra aplicación de consola sólo se pone el mango de la consola de modo que está emitiendo directamente a la consola (sin pasar por PowerShell). ISE no se basa en la consola, por lo que está intentando hacer que stderr nativo funcione correctamente con la secuencia de errores de PowerShell. IMO el comportamiento de la consola no es ideal en este caso. Entonces, ¿es mejor que ISE sea consistente con la consola o mejor que ISE maneje stderr mejor (excepto el bit sobre no respetar la redirección de flujo)? Obviamente, el PowerShell fue con el último.

+0

Esto no funciona. Todavía escribe un error usando 'Write-Error'. –

+0

@splatteredbits Sip, todavía lo hace. Actualicé mi respuesta para ofrecer otra opción. –

+0

¡Gracias por esto! Después de medio día de experimentación, este enfoque resultó ser el claro ganador. Tiene sus defectos pero, en general, funciona para lo que necesito. – Sander

Cuestiones relacionadas