Cuando mi script de PowerShell intenta, por ejemplo, crear un objeto de SQL Server para un servidor que no existe ("bla" en mi caso), PowerShell muestra muchos errores de PowerShell en rojo.
Dado que mi secuencia de comandos verifica el valor de $?
después de tales llamadas y muestra y registra errores, prefiero que no se muestren también las varias líneas de errores de PowerShell.
¿Cómo puedo desactivar los que se muestran en mi secuencia de comandos?
fuente
-ErrorAction:SilentlyContinue
en PS 5.1. Estaba llamando a mi cmdlet desde el lote, así que no sé si eso hace una diferencia. Pero buena información cuando sabe que se puede producir un error aceptable.Windows PowerShell proporciona dos mecanismos para informar errores: un mecanismo para terminar errores y otro mecanismo para errores que no terminan .
El código CmdLets interno puede llamar a un
ThrowTerminatingError
método cuando se produce un error que no permite o no debe permitir que el cmdlet continúe procesando sus objetos de entrada. El autor de la secuencia de comandos puede utilizar una excepción para detectar estos errores.EX:
El código CmdLets interno puede llamar a un
WriteError
método para informar errores no finales cuando el cmdlet puede continuar procesando los objetos de entrada. El guionista puede utilizar la opción -ErrorAction para ocultar los mensajes o utilizar$ErrorActionPreference
para configurar todo el comportamiento del script.fuente
Tuve un problema similar al intentar resolver los nombres de host usando
[system.net.dns]
. Si la IP no se resolvió, .Net arrojó un error de terminación. Para evitar el error de terminación y aún retener el control de la salida, creé una función usandoTRAP
.P.EJ
fuente
Estás muy desviado aquí.
Ya tienes un mensaje de error grande y agradable. ¿Por qué diablos querría escribir código que verifique
$?
explícitamente después de cada comando ? Esto es enormemente engorroso y propenso a errores. La solución correcta es dejar de comprobar$?
.En su lugar, use el mecanismo integrado de PowerShell para explotar por usted. Lo habilita estableciendo la preferencia de error en el nivel más alto:
Pongo esto en la parte superior de cada script que escribo, y ahora no tengo que comprobarlo
$?
. Esto hace que mi código sea mucho más simple y confiable.Si se encuentra con situaciones en las que realmente necesita deshabilitar este comportamiento, puede mostrar
catch
el error o pasar una configuración a una función en particular usando el archivo common-ErrorAction
. En su caso, probablemente desee que su proceso se detenga en el primer error, detecte el error y luego regístrelo.Tenga en cuenta que esto no maneja el caso cuando los ejecutables externos fallan (código de salida distinto de cero, convencionalmente), por lo que aún debe verificar
$LASTEXITCODE
si invoca alguno. A pesar de esta limitación, la configuración aún ahorra mucho código y esfuerzo.Fiabilidad adicional
También puede considerar usar el modo estricto :
Esto evita que PowerShell proceda silenciosamente cuando usa una variable inexistente y en otras situaciones extrañas. (Consulte el
-Version
parámetro para obtener detalles sobre lo que restringe).La combinación de estas dos configuraciones hace que PowerShell sea mucho más un lenguaje a prueba de fallas, lo que hace que la programación en él sea mucho más fácil.
fuente
Agregue
-ErrorAction SilentlyContinue
a su guión y estará listo para comenzar.fuente
En algunos casos, puede canalizar después del comando un Out-Null
fuente
Si desea suprimir el mensaje de error de PowerShell para un cmdlet, pero aún desea detectar el error, use "-erroraction 'silenntlyStop'"
fuente
New-Item -ItemType directory
(PowerShell v2.0)