write variable script salir powershell

script - powershell write output variable



Terminando un script en PowerShell (10)

Coincidentemente, descubrí que Break <UnknownLabel> (por ejemplo, simplemente Break Script , donde no existe la etiqueta Script ) parece salirse de todo el script (incluso desde dentro de una función) y mantiene vivo al host.
De esta manera, podría crear una función que rompa el script desde cualquier lugar (por ejemplo, un bucle recursivo) sin saber el alcance actual (y crear etiquetas):

$rerun = Read-Host "Rerun report (y/n)?" if($rerun -eq "y") { Show-MemoryReport } if($rerun -eq "n") { Exit }

He estado buscando una manera de terminar 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, no hay tal cosa como $host.Exit() . Hay $host.SetShouldExit() , pero esto realmente cierra la ventana de la consola, que no es lo que quiero. Lo que necesito es algo equivalente a sys.exit() Python que simplemente detendrá la ejecución del script actual sin más adiós.

Edit: sí, es sólo exit . Duh


Creo que estás buscando Return lugar de Break . La ruptura se usa normalmente para bucles y solo se interrumpe desde el bloque de código más interno. Use Return para salir de una función o script.



Lanzar una excepción será bueno, especialmente si desea aclarar el motivo del error:

throw "Error Message"

Esto generará un error de terminación.


Me doy cuenta de que esta es una publicación antigua, pero me encuentro volviendo mucho a este hilo, ya que es uno de los mejores resultados de búsqueda al buscar este tema. Sin embargo, siempre salgo más confundido que cuando vine debido a la información conflictiva. En última instancia, siempre tengo que realizar mis propias pruebas para averiguarlo. Así que esta vez voy a publicar mis conclusiones.

TL; DR La mayoría de las personas querrán usar Exit para terminar un script en ejecución. Sin embargo, si su script simplemente declara que las funciones se usarán más adelante en un shell, entonces querrá usar Return en las definiciones de dichas funciones.

Salir vs Regresar vs Pausa

  • Salir: Esto "saldrá" del contexto actualmente en ejecución. 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. Por lo tanto, si solo se llama a esa función desde un script en ejecución, saldrá de ese script. Sin embargo, si su secuencia de comandos simplemente declara la función para que se pueda usar desde el shell actual y usted ejecute 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 comando Exit .

    Nota: de forma predeterminada, si hace clic con el botón derecho en una secuencia de comandos para ejecutarla en PowerShell, una vez que se ejecuta la secuencia de comandos, PowerShell se cerrará automáticamente. Esto no tiene nada que ver con el comando Exit o cualquier otra cosa en su script. 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 es cierto para los archivos por lotes y la ventana de línea de comandos.

  • Volver: Esto volverá 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á a 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 comando Return fuera de cualquier función, entonces cuando vuelve al shell, no hay más comandos para ejecutar, por lo que un Return utiliza de esta manera esencialmente igual que Exit .

  • Descanso: Esto romperá los bucles y cambiará los casos. Si llama a este comando mientras no está en un bucle o un caso de conmutador, saldrá de la secuencia de comandos. Si llama Break dentro de un bucle que está anidado dentro de un bucle, solo saldrá del bucle en el que se llamó.

    También hay una característica interesante de Break donde puede prefijar un bucle con una etiqueta y luego puede salir de ese bucle etiquetado incluso si se llama al comando Break 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 }


Puede ser que sea mejor usar "trampa". Una captura de PowerShell especifica un bloque de código para ejecutar cuando se produce una terminación o un error. Tipo

Get-Help about_trap

para aprender más sobre la declaración de la trampa.



Utilicé esto para volver a ejecutar un programa. No sé si sería útil, pero es una declaración simple si requiere solo dos entradas diferentes. Funcionó en PowerShell para mí.

Function Quit($Text) { Write-Host "Quiting because: " $Text Break Script }

No sé si esto ayuda, pero creo que esto estaría en la línea de terminar un programa después de haberlo ejecutado. Sin embargo, en este caso, cada entrada definida requiere una salida clasificada y categorizada. También puede hacer que la salida llame una nueva línea de solicitud y finalice el programa de esa manera.


Write-Error es para errores que no terminan y throw es para terminar errores

El cmdlet Write-Error declara un error de no terminación. De forma predeterminada, los errores se envían en la secuencia de errores al programa host para que se muestre, junto con la salida.

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 de no terminación en un elemento de una colección de elementos de entrada, el comando continúa procesando los otros elementos de la colección.

Para declarar un error de terminación, use la palabra clave Throw. Para obtener más información, consulte about_Throw ( throw ).


Exit saldrá de PowerShell. Si desea "romper" solo la función o el script actual, use 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..." }