Switch parameters en PowerShell

PowerShell, DevOps


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. Si le añado algunas modificaciones al código, el resultado sigue siendo el esperado:

Function Do-Something([Switch]$Recurse) {
    if ($Recurse.IsPresent) { 
        Write-Host "Lo haré recursivo"
    } Else {
        Write-Host "No lo haré recursivo"
    }
}

Do-Something -Recurse
Do-Something

Hasta aquí todo bien, pero en realidad no lo he estado haciendo como está recomendado. Si me diese por hacer una prueba en Pester en la que me viese obligado a verificar el $Recurse de este modo:

$Recurse | Should Be $True

Obtendría un resultado inesperado, ya que en realidad $Recurse no es de tipo Boolean. Al hacer un GetType() es posible ver que en realidad es de tipo System.Management.Automation.SwitchParameter. En realidad la forma correcta de verificar si me han pasado el parámetro es así:

$Recurse.IsPresent | Should Be $True

Y si alguna vez es necesario tratarlo como un boolean, siempre es posible recurrir al método ToBool().

Publicado originalmente en el blog de Modesto San Juan.