需要冒号的Powershell命令行开关参数的处理是什么?
考虑Exchange 2010管理外壳cmdlet Move-ActiveMailboxDatabase。确认开关是System.Management.Automation.SwitchParameter
,必须像这样使用,
Move-ActiveMailboxDatabase -Confirm:$false
没有冒号,命令无法识别不确认开关,
Move-ActiveMailboxDatabase -Confirm $false
为什么?结肠在那里有什么不同?为什么Exchange2010似乎是我唯一注意到这种行为?
我浏览过Powershell in Action和Powershell 2.0,但没有找到任何关于这种语法的内容。然而,范围解析和.Net对象访问用途记录在这些书中。
我的Google-fu发现article声称它明确转发了切换参数值,但无法解释这是什么。
答案 0 :(得分:21)
当你这样做时:
Move-ActiveMailboxDatabase -Confirm $false
您并不是说Confirm
参数接受$false
。您正在说-Confirm
并且还将(单独的)参数传递给值为$false
的cmdlet。
由于Confirm
是一个开关,只有-Confirm
的存在意味着它是真的。没有-Confirm
意味着它是错误的。
让我给你一个脚本示例:
param([switch]$test)
write-host Test is $test
如果您只运行没有任何参数/参数的脚本,即.\script.ps1
,您将获得输出:
Test is False
如果将其作为.\script.ps1 -test
运行,则输出为
Test is True
如果将其作为.\script.ps1 -test $false
运行,则输出为
Test is True
如果您将其作为.\script.ps1 -test:$false
运行,则输出为
Test is False
在某些情况下,交换变量本身的值必须由另一个使用:
的变量确定。
例如,考虑脚本:
param ([boolean]$in)
function func([switch] $test){
write-host Test is $test
}
func -test:$in
如果您将其作为.\script.ps1 -in $false
运行,则会获得
Test is false
如果您无法使用:
,则必须将其写为:
if($in){ func -test}
else { func }
答案 1 :(得分:6)
冒号可以与每个参数值一起使用,但在开关参数的情况下更为特殊。切换参数不带值,它们存在($ true)或不存在($ false)。
想象一下,你有这样的功能:
function test-switch ([string]$name,[switch]$force) { ... }
你这样称呼它:
test-switch -force $false
由于切换参数是否存在,$ false实际上会绑定到Name参数。那么,如何将值绑定到switch参数?用冒号:
test-switch -force:$false
现在参数binder知道该值的参数。