检查开关值的正确方法是什么?
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)
我知道这两个语句是否都能正常工作,但是如何?
$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],这在其他情况下可能很重要。