tl;博士
# Pass the $itNeedsT Boolean - which indicates whether the -T switch should
# be passed - as the switch's *value*.
command -T:$itNeedsTheT
如果$itNeedsTheT
是$false
,则上述内容与省略 -T
相同-通常(请继续阅读以了解详细信息)。
注意需要使用:
将开关名称与值分开。
正如boxdog在评论中指出的那样,在与splatting ( @parameters
)一起使用的哈希表中,您使用一个布尔值来表示一个开关参数(一个类似标志的类型参数[switch]
)。
# Dynamically determine if -Recurse should be turned on.
$recurseIfTrue = $true
# Define the hashtable for splatting...
$parameters = @{
Path = '.'
Recurse = $recurseIfTrue # turn the -Recurse switch on or off
}
# ... and pass it to the target command.
# *Loosely speaking*, the following command is the same as either:
# Get-ChildItem -Path '.' -Recurse # if $recuseIfTrue was $true
# or:
# Get-ChildItem -Path '.' # if $recuseIfTrue was $false
Get-ChildItem @parameters
也就是说,粗略地说:
- 用于通过开关
$true
_
- 用于
$false
不通过开关。
这允许您保留一个无条件包含 switch 参数的哈希表定义,但其值可以通过编程方式确定。
警告:
严格来说,哈希表条目Recurse = $true
转换为参数-Recurse:$true
,而Recurse = $false
不是转换为省略参数,它转换为传递-Recurse:$false
。
在大多数情况下,省略一个开关-Foo
并用值传递它$false
- 即-Foo:$false
- 是等效的。
但是,命令可以检测到差异,有时会采取不同的行动:
一个值得注意的例子是-Confirm
common (switch) 参数:省略 -Confirm
意味着$ConfirmPreference
偏好变量被尊重,而-Confirm:$false
意味着偏好变量应该被覆盖(并且不应该请求确认)。
如果您想自己在 PowerShell 脚本或函数中进行区分$PSBoundParameters.ContainsKey('Foo')
,除了检查$Foo
( -Foo
) 开关参数变量的值之外,还可以调用。
如果您正在处理这样的命令并且您想以编程方式强制省略开关参数,您将别无选择,只能在单独的步骤中有条件地为此开关添加一个条目:
# Dynamically determine if -Recurse should be turned on.
$recurseIfTrue = $true
# A 'Recurse' key now can NOT be included unconditionally,
# if you want to *omit* -Recurse in case $recurseIfTrue is $false
$parameters = @{
Path = '.'
}
# Add a 'Recurse' entry only if the switch should be passed.
if ($recurseIfTrue) {
$parameters.Recurse = $true
}
Get-ChildItem @parameters
最后,请注意,作为通过 splatting 以编程方式指定开关值的替代方法,您可以直接将动态值传递给开关:
# Dynamically determine if -Recurse should be turned on.
$recurseIfTrue = $true
Get-ChildItem -Path . -Recurse:$recurseIfTrue
注意需要使用:
将开关名称与其值分开。
这是必要的,因为使用惯用的空格将参数名称与其值分开会导致 PowerShell 将布尔值解释为下一个参数,因为开关参数通常不带值。
尽管很少使用,但这种:
基于 - 的语法适用于所有参数类型。