2011-03-10 15 views
13

¿Por qué el cmdlet Powershell's Write-Error no funciona para mí? Mi salida no se ve como los ejemplos en la documentación:Escribiendo al flujo de error en Powershell usando Write-Error

PS C:\> Write-Error "This is an error" 
Write-Error "This is an error" : This is an error 
    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 

que había estado esperando una salida similar a Write-Warning:

PS H:\> Write-Warning "This is a warning" 
WARNING: This is a warning 

De la documentación Write-Error y about_preference_variables pensé que no debería ver alguna excepción ?

PS H:\> Get-Help About_Preference_Variables 

$ErrorActionPreference 
---------------------- 

... 

     PS> $erroractionpreference      
     Continue  # Display the value of the preference.     

     PS> write-error "Hello, World"     
           # Generate a non-terminating error. 

     write-error "Hello, World" : Hello, World  
           # The error message is displayed and 
            execution continues. 

     PS> write-error "Hello, World" -ErrorAction:SilentlyContinue 
           # Use the ErrorAction parameter with a 
            value of "SilentlyContinue". 
     PS>            
           # The error message is not displayed and 
            execution continues. 
+0

¿Qué esperas ver en la salida? El que publicaste se ve perfectamente normal para mí. –

+1

@zespri Esperaba algo similar a Write-Warning ... He editado la pregunta para incluir un ejemplo. –

+2

La salida que está viendo es correcta. La salida cambió con v2.0 IIRC para ser un poco más detallado. La documentación es incorrecta, no es la primera vez que ocurre. :-) –

Respuesta

14

Para obtener una salida similar a la escritura de advertencia, puede hacer esto:

$Host.UI.WriteErrorLine("This is an error") 

(apoyos a Chris Sears para esta respuesta)

+0

¡Genial! Esto es definitivamente útil para mí. –

+2

Curiosamente, esto escribe en stdout, no stderr. PowerShell ISE aparece no echo stderr, aunque sí lo hace el indicador de PowerShell normal (sin aplicar un formato especial). Intenta ejecutar '[System.Console] :: Error.WriteLine ('test')' en cada uno y ver qué pasa. – Zenexer

+2

No hagas esto. 'WriteErrorLine' es un método de interfaz de usuario, razón por la cual Zenexer dice que nada se redirige a stderr. Vea la respuesta de Keith Hill y http://stackoverflow.com/questions/4998173/how-do-i-write-to-standard-error-in-powershell. –

2

Creo que está viendo el resultado esperado de ese cmdlet. Está ingresando el "Acceso denegado". argumento y lo envía al host y lo más probable es que la secuencia de error esté diseñada. Puede confirmar que está enviando a la variable $ Error y debe rellenarse con el error que acaba de insertar.

decir

PS C:\> $error.Clear() 

PS C:\> Write-Error "access denied" 

Write-Error "access denied" : access denied 

    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 

PS C:\> $error 

Write-Error "access denied" : access denied 

    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 

puedo ver que eso sería confuso, sin embargo, tal vez MSFT debe cambiar el error ejemplo de algo así como "Acceso denegado" a "Foobar" para mayor claridad.

Editar para resolver la pregunta siguiente: El error predeterminadoAcción para Write-Error es "continuar", por lo que para que se comporte como Write-Warning tendrías que agregar -ErrorAction SilentlyContinue. Considere el siguiente ejemplo:

PS E:\> $error.clear() 
PS E:\> Write-Error 'test' 
Write-Error 'test' : test 
    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 

PS E:\> Write-Error 'test2' -ErrorAction silentlycontinue 

PS E:\> $error[1] 
Write-Error 'test' : test 
    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 

PS E:\> $error[0] 
Write-Error 'test2' -ErrorAction silentlycontinue : test2 
    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorException 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 
+0

¿Por qué obtengo el "CategoryInfo no especificado" WriteErrorException? La documentación dice que es opcional ... –

+0

Enumera la información de la categoría como no especificada porque se trata de la salida de error estándar, que es lo que hace Write-Error; cuando cualquier error se lanza en PS que se muestra la plantilla ... ejemplo: 'código PS E: \> lkas El término 'lkas' no se reconoce En línea: 1 carácter: 7 + lkas <<<< + CategoryInfo: ObjectNotFound: (lkasjd: String) [], CommandNotFoundException + FullyQualifiedErrorId: CommandNotFoundException 'code' La información Categoría aparece siempre; aparece como no especificado ya que no lo especificó explícitamente con el comando Write-Error. –

+0

Lo siento, arruiné el mini-descuento allí. Tenga en cuenta que edité mi publicación original para abordar el alcance adicional de la pregunta. Perdón por el desastre :) –

5

¿Por qué cree que no funciona? Tenga en cuenta que PowerShell distingue entre errores no concluyentes como el anterior y los errores de terminación como los que obtiene al ejecutar throw 'Access denied.'. Los errores que no terminan se escriben en stderr y se registran en la colección $ error, pero no detienen el procesamiento de un script. Esta función es extremadamente útil cuando procesa (por ejemplo, eliminar o copiar) un grupo de archivos. Desea saber qué archivos no se pueden procesar, pero no desea que toda la operación se detenga en el primer archivo que se haya eliminado.

PowerShell también le ofrece la opción de "convertir" los errores que no terminan en errores de terminación, p.

Remove-Item c:\file-doesnt-exist -ErrorAction Stop; "Did I get here" 

Observe en este caso, la ejecución se detiene y no imprime la cadena al final. Pruébalo sin el -ErrorAction Stop y verás el error, pero también verás la cadena "¿He llegado aquí?".

Si desea controlar la información catogory puede utilizar el parámetro -Categoría así:

PS> write-error "foo" -Category 'InvalidResult' 
write-error "foo" -Category 'InvalidResult' : foo 
    + CategoryInfo   : InvalidResult: (:) [Write-Error], WriteErrorExce.. 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException 

Pero el WriteErrorException es el mecanismo (creo) por el cual este cmdlet plantea el error. Hay un parámetro Exception pero no he tenido mucha suerte al usarlo.

Cuestiones relacionadas