2011-12-15 129 views
9

需要冒号的Powershell命令行开关参数如何处理?Powershell:命令行参数中的冒号

考虑Exchange 2010管理shell cmdlet Move-ActiveMailboxDatabase。 Confirm开关是System.Management.Automation.SwitchParameter,必须像这样被使用,

Move-ActiveMailboxDatabase -Confirm:$false 

没有冒号命令无法识别不确认像这样开关,

Move-ActiveMailboxDatabase -Confirm $false 

这是为什么?冒号在那里有什么不同?为什么Exchange2010似乎是我注意到这种行为的唯一事情?

我已经通过Powershell在Action和Powershell 2.0中浏览过,但没有发现任何有关此语法的内容。范围解析和.Net对象访问使用记录在这些书上。

我的Google-fu找到了一个article,它声称它明确地转发了开关参数值,但未能解释它是什么。

回答

19

当你这样做:

Move-ActiveMailboxDatabase -Confirm $false 

你不是说Confirm参数接受$false。您的意思是-Confirm并将值(单独)传递给该值为$false的cmdlet。

由于Confirm是一个开关,只是存在-Confirm意味着它是真实的。缺少-Confirm意味着它是错误的。

让我给你一个脚本示例:

param([switch]$test) 

write-host Test is $test 

如果只是运行该脚本不带任何参数/ paramters即.\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 } 
+0

不是完整的答案 - 我不知道Mailboxes的例子,但是在很多其他情况下(例如`Set-SMBServerConfiguration`),`-Confirm:$ false`的效果与它不一样。我可以使用`-Confirm:$ false`或`-Force`,否则我需要确认。 – Lamarth 2015-12-22 03:39:07

4

冒号可以用于每个参数ter值,但在开关参数情况下更为特殊。开关参数不带值,它们可以存在($ true)或不存在($ false)。

想象一下,你有这样的功能:

function test-switch ([string]$name,[switch]$force) { ... } 

而且你怎么称呼它,像这样:

test-switch -force $false 

由于开关参数或者是存在与否,$假实际上绑定到名称参数。那么,你如何将一个值绑定到开关参数?冒号:

test-switch -force:$false 

现在参数联编程序知道值到哪个参数。