2011-12-15 21 views
9

Qual è l'accordo con i parametri del commando del commutatore PowerShell che richiedono i due punti?PowerShell: Colon nei parametri del commandlet

Prendere in considerazione il cmdlet di shell di gestione di Exchange 2010 Move-ActiveMailboxDatabase. L'opzione Confirm è un System.Management.Automation.SwitchParameter e deve essere utilizzato in questo modo,

Move-ActiveMailboxDatabase -Confirm:$false 

Senza i due punti il ​​comando non riesce a riconoscere la non confermano l'interruttore in questo modo,

Move-ActiveMailboxDatabase -Confirm $false 

Perché? Qual è la differenza che fa il colon? Perché Exchange2010 sembra essere l'unica cosa che ho notato questo comportamento?

Ho sfogliato Powershell in Action e Powershell 2.0, ma non ho trovato nulla su questa sintassi. La risoluzione dell'ambito e gli usi di accesso agli oggetti .Net sono tuttavia documentati su questi libri.

Il mio Google-fu ha trovato un article che afferma che inoltra esplicitamente i valori dei parametri, ma non riesce a spiegare di cosa si tratta.

risposta

19

Quando si esegue:

Move-ActiveMailboxDatabase -Confirm $false 

non si sta dicendo Confirm parametro accetta l'$false. Si sta dicendo -Confirm e si passa anche un argomento (separato) al cmdlet con il valore $false.

Poiché Confirm è un interruttore, solo la presenza di -Confirm significa che è vero. L'assenza di -Confirm significa che è falso.

Lasciate che vi faccia un esempio di script:

param([switch]$test) 

write-host Test is $test 

Se basta eseguire lo script senza argomenti/paramters cioè .\script.ps1 si ottiene in uscita:

Test is False 

Se lo si esegue come .\script.ps1 -test, l'output è

Test is True 

Se lo si esegue come .\script.ps1 -test $false, l'uscita è

Test is True 

Se si esegue come .\script.ps1 -test:$false l'uscita è

Test is False 

È in scenari in cui il valore di una variabile interruttore stesso deve essere determinato da un'altra variabile che il : si usa.

Ad esempio, si consideri lo script:

param ([boolean]$in) 

function func([switch] $test){ 
write-host Test is $test 
} 

func -test:$in 

Qui se lo si esegue come .\script.ps1 -in $false, si ottiene

Test is false 

Se non è stato in grado di utilizzare il :, si avrebbe avuto per scrivere come:

if($in){ func -test} 
else { func } 
+0

Non la risposta completa - Non so sull'esempio Mailboxes, ma in molti altri casi (ad esempio 'Set-SMBServerConfiguration'), l'effetto di' -Confirm: $ false' è diverso dalla sua assenza. Posso usare '-Confirm: $ false' o' -Force', altrimenti ho bisogno di confermare. – Lamarth

4

I due punti possono essere utilizzati con ogni parametro valore ma è più speciale nel caso di parametri di commutazione. I parametri switch non accettano valori, sono presenti ($ true) o assenti ($ false).

Immaginate di avere una funzione come questa:

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

e si chiama in questo modo:

test-switch -force $false 

Dal parametri dello switch sono presenti o meno, $ false sarebbe in realtà legarsi al nome parametro. Quindi, come si associa un valore a un parametro di commutazione? Con i due punti:

test-switch -force:$false 

Ora il raccoglitore di parametri conosce a quale parametro va il valore.

Problemi correlati