Nunca nada es sencillo cuando se habla de código. Pregúntale a 10 desarrolladores (o scripters) cómo hacer algo, y obtendrás 10 respuestas diferentes que logran lo mismo. La respuesta siempre depende de cómo y dónde se ejecuta el código, qué necesita ejecutarse después (si es que hay algo) y cuáles son las dependencias, entre otros factores. Y lo mismo ocurre con el código de PowerShell.
PowerShell no es necesariamente un lenguaje de programación, pero exhibe muchas de las mismas características. Tomemos la terminación de la ejecución del código, por ejemplo. A veces, un script de PowerShell necesita detener la ejecución, o terminar muerto en su camino. Tal vez el script explotó y fue tan catastrófico que el error no pudo ser recuperado. O tal vez es un asunto menos complicado, como cuando el criterio necesario para ejecutar el script no se cumple y ya no es útil. En pocas palabras, hay muchas razones para terminar la ejecución del código antes de que se ejecute por completo.
Alcances
Terminar con la «ejecución del código» puede significar diferentes cosas. Es importante notar que cuando se detiene el código de PowerShell no significa necesariamente que se detenga todo el script. PowerShell contiene muchos alcances diferentes. Piense en un ámbito como una barrera que impide que cierto código vea otro código (todo el código dentro de cada ámbito es su propia entidad). Los alcances también se crean en una jerarquía, así que un alcance padre puede contener múltiples alcances hijo, por ejemplo. Algunos métodos para terminar la ejecución del código simplemente terminan el ámbito y no el guión completo.
Hay muchas maneras diferentes de detener la ejecución de código de ejecutar comandos menos conocidos como [Entorno]::Exit(1), $host.SetShouldExit() y $host.Exit(). Pero, en general, logran lo mismo. Estas son las formas nucleares de detener la ejecución del código; simplemente salen del actual host de PowerShell.
Piénsalo así: La consola de PowerShell en sí misma es un anfitrión. Si ejecutas uno de estos comandos directamente en la consola, saldrá de la consola. De la misma manera, si pones uno de estos comandos en un script o incluso en una función en un script, todo el host saldrá. Este es el enfoque nuclear y, ya habrás adivinado que no se usa muy a menudo.
Hay tres opciones más conocidas para terminar la ejecución del código de PowerShell, incluyendo la salida, el regreso y el descanso. Echemos un vistazo más a fondo a estas, y cuando podría querer usarlas en un script.
Salida
La palabra clave exit se utiliza para salir de los contextos; saldrá del contexto (actualmente en ejecución) en el que se está ejecutando su código. Esto significa que si usas esta palabra clave en un script, y lanzas el script directamente desde tu consola, saldrá tanto el script como la consola ya que ambos se están ejecutando en el mismo contexto. Sin embargo, si utilizas la palabra clave exit en una función dentro del script, y llamas a esa función desde el mismo script, sólo saldrá del script y no de toda la consola. La palabra clave de salida se utiliza mejor en funciones, y cuando esas funciones se llaman en un guión. Es una gran manera de terminar la ejecución de las funciones.
Retorno
La palabra clave return no necesariamente termina la ejecución del código, sino que lo redirige. La palabra clave return se usa para devolver la ejecución del código al punto anterior en el que fue llamado. Por ejemplo, si return es simplemente ejecutado desde la consola del shell, no pasará nada porque ese es el punto en el que fue llamado. Si return se usa en un script, detendrá la ejecución del código (en ese punto del script) y volverá al punto en el que fue llamado. Si el script es llamado desde el shell, devolverá la ejecución al shell.
La palabra clave retorno es muy útil, pero rastrearla puede ser confuso si tienes capas y capas de funciones. Sin embargo, es una de las opciones más versátiles para redirigir la ejecución del código.
Romper
La palabra clave de ruptura difiere de la de retorno y salida, aunque es más similar a la de retorno. Break se usa generalmente en los bucles y las declaraciones del interruptor. Si se usa en este contexto, break «saldrá» de un bucle o una sentencia switch. Esto significa que si un bucle está procesando todos los elementos de una colección, y se utiliza break, terminará todo el bucle y no se procesarán más elementos.
Break también puede ser usado fuera de sus construcciones típicas, y puede ser simplemente colocado en un guión fuera de un bucle. En este caso, break detendrá toda la ejecución del guión, incluso si se llama dentro de una función en el guión. Es una excelente manera de asegurar que todo el guión se detenga dondequiera que esté (excluyendo en un bucle o en una sentencia switch).
Para llevar
Como puedes ver, hay muchas maneras de detener o redirigir la ejecución del código en un script de PowerShell. Pero describir el comportamiento de cada método en una simple entrada de blog no es tan eficiente como ponerlo en acción, y es por eso que sugiero encarecidamente jugar con estas palabras clave. Insértalas en diferentes lugares dentro de tus scripts y observa cómo se comporta tu script. Una vez que tengas una idea de cómo funcionan estas palabras clave, podrás saber mejor cuándo es necesario usarlas.
Contenidos