什么是检查开关参数的正确方法

Vai*_*hav 1 powershell

检查开关值的正确方法是什么?

function testSwitch
{
    Param(
        [switch] $swth
    )

    Write-Host "Value of swth is $swth"

    if($swth.IsPresent){
        Write-host "Switch is present"
    }
    if($swth){
        Write-Host "Switch is present"
    }

}

testSwitch -swth
Run Code Online (Sandbox Code Playgroud)

我知道这两个语句是否都能正常工作,但是如何?

mkl*_*nt0 5

$swth.IsPresent并且$swth可以互换使用,因为在布尔值上下文(例如if条件)$swth[switch]表示switch参数的类型的实例)中,有效地返回.IsPresent属性的值。[1]

实际上,$swth可能更可取[2],不仅为了简洁,而且因为该.IsPresent属性的名称有些混乱:

.IsPresent本身并不表示该开关的存在,而是表示其$true是否

虽然本身指定开关- -swth-意味着这两种,如果你明确地将其设置为相同的是不正确的$false:传递-swth:$false品牌.IsPresent回归$false,即使开关显然存在

$false显式传递并不常见,但是有其用途,例如,当使用退出确认提示时-Confirm:$false

因此,如果您要区分未通过开关的用户和通过value $false传递开关的用户,.IsPresent将无济于事-您必须使用$PSBoundParameters.ContainsKey('swth')


[1]在转换为Boolean时,发生在method中LanguagePrimitives.IsTrue(),PowerShell调用[switch]实例的.ToBool()method,该方法又返回该.IsPresent属性后面的私有支持变量。

[2]唯一的警告是,您必须意识到它$swth不是Boolean([bool]),而是type [switch],这在其他情况下可能很重要。