Terminar un script en PowerShell
He estado buscando una manera de finalizar un script de PowerShell (PS1) cuando ocurre un error irrecuperable dentro de una función. Por ejemplo:
function foo() {
# Do stuff that causes an error
$host.Exit()
}
Por supuesto que no existe tal cosa $host.Exit()
. Lo hay $host.SetShouldExit()
, pero esto en realidad cierra la ventana de la consola, que no es lo que quiero. Lo que necesito es algo equivalente a Python sys.exit()
que simplemente detenga la ejecución del script actual sin más preámbulos.
Editar: Sí, es solo exit
.
Me doy cuenta de que esta es una publicación antigua, pero vuelvo a este hilo con frecuencia, ya que es uno de los principales resultados de búsqueda cuando se busca este tema. Sin embargo, siempre salgo más confundido que cuando vine debido a la información contradictoria. Al final siempre tengo que realizar mis propias pruebas para resolverlo. Así que esta vez publicaré mis hallazgos.
TL;DR La mayoría de la gente querrá utilizarlo Exit
para finalizar scripts en ejecución. Sin embargo, si su secuencia de comandos simplemente declara funciones que luego se usarán en un shell, entonces querrá usarlas Return
en las definiciones de dichas funciones.
Salir vs Regresar vs Romper
Salir: Esto "saldrá" del contexto que se está ejecutando actualmente. Si llama a este comando desde un script, saldrá del script. Si llama a este comando desde el shell, saldrá del shell.
Si una función llama al comando Salir, saldrá del contexto en el que se esté ejecutando. Entonces, si esa función solo se llama desde un script en ejecución, saldrá de ese script. Sin embargo, si su secuencia de comandos simplemente declara la función para que pueda usarse desde el shell actual y ejecuta esa función desde el shell, saldrá del shell porque el shell es el contexto en el que se ejecuta la función que contiene el
Exit
comando.Nota: De forma predeterminada, si hace clic derecho en un script para ejecutarlo en PowerShell, una vez que el script termine de ejecutarse, PowerShell se cerrará automáticamente. Esto no tiene nada que ver con el
Exit
comando ni con nada más en su secuencia de comandos. Es solo un comportamiento predeterminado de PowerShell para los scripts que se ejecutan utilizando este método específico de ejecutar un script. Lo mismo ocurre con los archivos por lotes y la ventana de línea de comandos.Regresar: Esto regresará al punto de llamada anterior. Si llama a este comando desde un script (fuera de cualquier función), volverá al shell. Si llama a este comando desde el shell, volverá al shell (que es el punto de llamada anterior para un solo comando ejecutado desde el shell). Si llama a este comando desde una función, volverá al lugar desde donde se llamó la función.
La ejecución de cualquier comando después del punto de llamada al que se devuelve continuará desde ese punto. Si se llama a un script desde el shell y contiene el
Return
comando fuera de cualquier función, cuando regresa al shell no hay más comandos para ejecutar, por lo que unReturn
uso de esta manera es esencialmente lo mismo queExit
.Romper: esto romperá los bucles y cambiará de caja. Si llama a este comando mientras no está en un bucle o cambio de caso, se saldrá del script. Si llama
Break
dentro de un bucle que está anidado dentro de un bucle, solo saldrá del bucle en el que fue llamado.También hay una característica interesante en
Break
la que puede prefijar un bucle con una etiqueta y luego puede salir de ese bucle etiquetado incluso si elBreak
comando se llama dentro de varios grupos anidados dentro de ese bucle etiquetado.While ($true) { # Code here will run :myLabel While ($true) { # Code here will run While ($true) { # Code here will run While ($true) { # Code here will run Break myLabel # Code here will not run } # Code here will not run } # Code here will not run } # Code here will run }
Deberías utilizar la exit
palabra clave .
Exit
También saldrá de PowerShell. Si desea "salir" sólo de la función o script actual, utilice Break
:)
If ($Breakout -eq $true)
{
Write-Host "Break Out!"
Break
}
ElseIf ($Breakout -eq $false)
{
Write-Host "No Breakout for you!"
}
Else
{
Write-Host "Breakout wasn't defined..."
}
Write-Error es para errores que no terminan y throw es para errores que terminan
El cmdlet Write-Error declara un error sin terminación. De forma predeterminada, los errores se envían en la secuencia de errores al programa host para que se muestren, junto con el resultado.
Los errores que no terminan escriben un error en la secuencia de errores, pero no detienen el procesamiento del comando. Si se declara un error sin terminación en un elemento de una colección de elementos de entrada, el comando continúa procesando los demás elementos de la colección.
Para declarar un error de terminación, utilice la palabra clave Throw. Para obtener más información, consulte about_Throw ( http://go.microsoft.com/fwlink/?LinkID=145153 ).
Finaliza este proceso y proporciona al sistema operativo subyacente el código de salida especificado.
https://msdn.microsoft.com/en-us/library/system.environment.exit%28v=vs.110%29.aspx
[Environment]::Exit(1)
Esto le permitirá salir con un código de salida específico, que puede ser recogido por la persona que llama.