2011-12-15 361 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 

現在參數聯編程序知道值到哪個參數。