2009-09-08 12 views
9

Tengo un script que ejecuta un exe externo. Cuando ese exe falla (establece errorlevel en 1), el script de powershell falla.¡Ignorando un nivel de error! = 0 en Windows Powershell

estoy corriendo curl.exe y conseguir esto: + CategoryInfo: NotSpecified: (% Total% ... El tiempo actual: String) [], RemoteException + FullyQualifiedErrorId: NativeCommandError

¿Cómo puedo ignorar/catch la falla del exe externo y continuar con mi script?

+0

¿Está seguro de que es un EXE externo que devuelve un código de error que está causando un error en PowerShell? Eso normalmente no provoca un error en PowerShell. De hecho, tiene que esforzarse para convertir un $ LASTEXITCODE que representa un error a un error de PowerShell. –

+0

¿Podría al menos publicar un código? Por lo general, la falla no es el comportamiento predeterminado en ese caso. – Joey

+0

estoy corriendo curl.exe y conseguir esto: + CategoryInfo: NotSpecified: (% Total% ... El tiempo actual: String) [], RemoteException + FullyQualifiedErrorId: NativeCommandError – ripper234

Respuesta

17

Esto no tiene nada que ver con el código de salida devuelto por el EXE. Se genera un error cuando un EXE escribe en stderr, pero solo dentro del ISE o cuando se trata de una conexión remota o que utiliza trabajos en segundo plano. Un exe que escribe en stderr no no genera errores desde el símbolo del sistema de PowerShell. No estoy seguro de por qué este es el caso, pero si puedo obtener más información sobre esto, actualizaré esta publicación.

+0

En el shell parece que stderr va directamente a la consola. Aunque si lo redirige a stdout (2> y 1), incluirá esos mensajes en ErrorRecords.¿Quizás el equipo de PowerShell decidió que ISE era el tipo de entorno en el que todos los errores deberían ser más evidentes? – JasonMArcher

+0

Más detalles en mi respuesta a continuación http://stackoverflow.com/a/11826589/284795 –

+0

Resolvió muchas horas de frustración, gracias –

1

Estaba ejecutando el script a través de powershell_ise (un IDE), creo que esto es lo que causó los problemas. Ejecutarlo a través de Powershell en sí parece funcionar.

11

En realidad, la aplicación funcionó bien: Powershell se equivoca al informar un error.

Cuando una aplicación se imprime como error estándar, Powershell algunas veces concluirá que la aplicación ha fallado. Esta es en realidad una decisión de diseño hecha por desarrolladores de Powershell. Pero esto es un error, porque muchas aplicaciones confiables (como curl) imprimen información útil a errores estándar durante el funcionamiento normal. La consecuencia es que Powershell solo funciona bien con otros scripts de Powershell, y no se puede confiar en que interopere con otras aplicaciones.


Otros lectores en este hilo tuvieron dificultades para reproducir el comportamiento porque Powershell lo implementa de manera incoherente. Si NativeCommandError se produce depende de cómo se redirige el error estándar (como consecuencia, el error se produce en Powershell ISE de vanilla pero no en Powershell de vanilla). Cualquiera que sea su opinión sobre la decisión de diseño en el primer párrafo, la implementación incoherente es para ciertos errores de Powershell $LastExitCode=0 but $?=False in PowerShell. Redirecting stderr to stdout gives NativeCommandError

+0

Esta es información importante. Estuve ocupado con este problema, con un script que funcionaba anteriormente, durante algunos meses, y luego fallaba continuamente. Pondré una nota en el archivo Léame sobre eso. Gracias por la explicación extendida –

Cuestiones relacionadas