[PowerShell] Variables automáticas

PowerShell dispone de una serie de variables gestionadas de forma automática que permiten obtener información relacionada con la ejecución de código actual. Su propósito y utilidad es variado, siendo algunas de uso muy frecuente y otras de uso marginal. En cualquier caso, no está mal conocer unas cuantas y que suene dentro de la cabeza que hay otras que tal vez sea útiles en el futuro.

Tanto la documentación oficial como el comando get-help about_automatic_variables contienen el listado completo, pero me gustaría enumerar por aquí algunas que me resultan interesantes o que tienen truco.

Algunas variables son de sobra conocidas para cualquiera que conozca medianamente PowerShell. Variables como $_, $true, $false, $Args, $NULL son de uso común incluso antes de saber siquiera qué es eso de las variables automáticas.

Relacionadas con la gestión de errores, las variables $?$Error podrían ser útiles, aunque hay que tratarlas con cuidado. En el primer caso, $? devuelve TRUE si la última operación se realizó correctamente o FALSE en caso contrario. La variable $Error en principio se trata de un array que contiene los errores más recientes. El problema que le veo a este array es que únicamente contiene los errores de PowerShell. Es decir, tomando este código como ejemplo:

ping error_forzado
$?
$Error

En un caso como este, la variable $? será False pero $Error no contendrá el error que ha dado el comando ping. La razón es que no se trata de un error de PowerShell. Cuando hacemos ping estamos invocando un ejecutable, no una función o cmdlet de PowerShell. Por eso hay que tener cuidado y normalmente es más conveniente capturar los errores mediante otros mecanismos.

Relacionado también la captura de errores está la variable $LastExitCode, que almacena el código de salida del último programa de windows ejecutado. en el ejemplo anterior, $LastExitCode tendría un valor de 1.

Otra variable muy interesante es $MyInvocation. Esta variable proporciona información sobre el comando que se está ejecutando actualmente, incluyendo el nombre del script, la función, la ruta, los parámetros, etc. Por ejemplo, las propiedades BoundParameters y UnboundArguments permiten acceder al listado de argumentos pasados a la función. UnboundArguments es algo así como $Args, aunque el tipo de $Args es Object[] y UnboundArguments  es de tipo List.

Otra variable interesante, relacionada con la anterior es $PSBoundParameters. En este caso la explicación es sencilla, llamar a esta variable es lo mismo que llamar a $MyInvocation.BoundParameters. Al menos así es en mi máquina, en la que $PSBoundParameters.Equals($MyInvocation.BoundParameters) devuelve True. Y recurro al clásico “en mi máquina funciona” porque me he encontrado por ahí quien dice lo contrario en función de la versión de PowerShell que se ejecute.

Y por último, dos que dan mucho juego: $PSCommmandPath$PSScriptRoot. Estas dos variables proporcionan respectivamente la ruta completa y el directorio del script desde el que se está ejecutando el código. Estas variables pueden resultar muy útiles para hacer referencias a rutas relativas a un script en concreto, independientemente del cual sea el valor de Get-Location. Eso si, es importante tener en cuenta que son de tipo string, si queremos manipularlas lo más conveniente suele ser crear variables de tipo DirectoryInfo o FileInfo a partir de sus valores.

Modesto San Juan

Desarrollo software e intento hacerlo bien