[PowerShell] Distinguir entre rutas relativas y absolutas

Esta vez toca un truco muy simple pero muy útil cuando tengo un script que recibe una ruta como parámetro. Es muy típico no saber si la ruta es absoluta o relativa y muy frecuente querer hacer un Join-Path con la ruta actual (o cualquier otra) en caso de que la ruta sea relativa. En ocasiones me olvido de que PowerShell tiene a su disposición toda la potencia de .Net y en este caso es precisamente útil. »

Author image Modesto San Juan

[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. »

Author image Modesto San Juan

[PowerShell] Ojo que no hay un único $null

Este es un ejemplo curioso de esos que me ha vuelto loco hasta que me he dado cuenta. Si parto de este código: $item1 = Get-ChildItem | Where-Object {$_ -eq "no encuentras esto ni de coña"} "item1 es nulo? {0}" -f ($null -eq $item1) $item2 = $null "item2 es nulo? {0}" -f ($null -eq $item2) Al ejecutarlo el resultado es “True” en ambos casos. Vamos, que tanto item1 como item2 son $null. »

Author image Modesto San Juan

[PowerShell] Saber si una variable ya ha sido definida

En ocasiones tengo la necesidad de saber si una variable ha sido previamente definida. Esto es especialmente importante porque utilizo siempre el “Set-StrictMode -Version 2” y, si necesito recurrir a variables de otros scopes, cuando intento acceder a una variable no definida obtengo un error. Aunque generalmente intento no recurrir a otros scopes, especialmente el $global, en ocasiones los necesito, especialmente el $script. Un ejemplo podría ser querer verificar si una variable que contiene un array ha sido inicializada o no, para poder añadirle ítems. »

Author image Modesto San Juan

[PowerShell] Devolver un array vacío desde una función

Esto es un truco rápido muy chorra pero que puede volver loco a más de un desarrollador que no esté acostumbrado a las peculiaridades de PowerShell. Tomando este código como ejemplo: function Get-EmptyArray { [System.Collections.ArrayList]$anyArray = @() return $anyArray } Write-Host (Get-EmptyArray).GetType() En principio podría resultar bastante evidente que el resultado de la ejecución será ver por pantalla la cadena “System.Collections.Arraylist”. Pues no, el resultado será un error como una casa del estilo de “You cannot call a method on a null-valued expression” »

Author image Modesto San Juan

[PowerShell] Las ventajas de usar parámetros y variables tipados

Cuanto más uso PowerShell más convencido estoy de lo importante que es tipar las variables y los parámetros de las funciones. Debido a la forma en que trabaja PowerShell, especificar los tipos me ayuda a evitar comportamientos indeseados. Por ejemplo, dado este script: Set-StrictMode -Version 2 $items = Get-ChildItem if ($items) { $items.Count } Si lo ejecuto estando en un directorio con varios archivos o carpetas, mostrará en pantalla el número de items. »

Author image Modesto San Juan

[PowerShell] Switch parameters

En PowerShell es muy común usar parámetros de tipo switch. La peculiaridad de estos parámetros es que al usarlos, se especifica el nombre del parámetro pero no se proporciona ningún valor, ya que se asume que al usarlo su valor será $true y $false si no se especifica. Ejemplos típicos son el uso de –_Recurse o -Force. _ Este sería un ejemplo de con este tipo de parámetros: Function Do-Something([Switch]$Recurse) { Write-Host $Recurse } Do-Something -Recurse Do-Something Si ejecuto este script, veré por pantalla $True y $False, como podría esperar. »

Author image Modesto San Juan

[PowerShell] Cuidado que ($a -eq $a) no siempre es $true

Este es uno de esos ejemplos en los que es importante intentar documentarse todo lo posible al desarrollar en un lenguaje/plataforma que no conocemos. Es frecuente asumir conceptos basados en nuestros conocimientos previos de otros lenguajes, pero en ocasiones nos puede jugar malas pasadas. En este caso voy a mostrar un ejemplo muy sencillo en el que yo asumí erróneamente el funcionamiento de algo tan sencillo como un operador de comparación. »

Author image Modesto San Juan

[PowerShell] Crear el fichero de manifiesto para muchos módulos a la vez

Hoy he tenido que crear de golpe el manifest a varios módulos. Teníamos más de 10 módulos (.psm1), cada uno en su propia carpeta y necesitaba añadirles el manifest para poder definir la empresa de cada módulo. Gracias al pipeline de PowerShell, no he tenido que esforzarme mucho para conseguirlo: ls *.psm1 -Recurse | ForEach-Object { $manifestFileName = $_.BaseName + ".psd1" $manifestPath = Join-Path $_.Directory $manifestFileName $companyConstant = "AnyCompany" New-ModuleManifest -Path $manifestPath -RootModule $_. »

Author image Modesto San Juan

[PowerShell] La importancia del Set-StrictMode

Cuando empecé a programar scripts en PowerShell, cometía muchísimos fallos fruto de mi intoxicación con otros lenguajes, especialmente C#, con el que trabajo habitualmente. Después de un tiempo, me di cuenta que PowerShell tiene muchas más similitudes con JavaScript que con C# ya que es un lenguaje interpretado y de tipado débil. Y un tiempo después, aprendí que podía programar en PowerShell de una manera más próxima a TypeScript. Lo explico de esta forma porque a mi cerebro le resulta más sencillo recurrir a este paralelismo. »

Author image Modesto San Juan