Terminar un script en PowerShell

Resuelto kprobst asked hace 14 años • 11 respuestas

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.

kprobst avatar Jan 08 '10 00:01 kprobst
Aceptado

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 Exitpara 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 Returnen 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 Exitcomando.

    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 Exitcomando 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 Returncomando fuera de cualquier función, cuando regresa al shell no hay más comandos para ejecutar, por lo que un Returnuso de esta manera es esencialmente lo mismo que Exit.

  • 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 Breakdentro 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 Breakla que puede prefijar un bucle con una etiqueta y luego puede salir de ese bucle etiquetado incluso si el Breakcomando 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
    }
    
New Guy avatar May 16 '2014 19:05 New Guy

Deberías utilizar la exitpalabra clave .

Michael Bray avatar Jan 07 '2010 18:01 Michael Bray

ExitTambié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..."
}
EverydayNerd avatar Oct 20 '2012 02:10 EverydayNerd

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 ).

Greg Bray avatar Dec 12 '2013 23:12 Greg Bray

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.

gabriwinter avatar Feb 25 '2015 16:02 gabriwinter