Powershell:命令行参数中的冒号

时间:2011-12-15 19:31:38

标签: powershell

需要冒号的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声称它明确转发了切换参数值,但无法解释这是什么。

2 个答案:

答案 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知道该值的参数。