2011-12-15 54 views
9

¿Cuál es el problema con los parámetros del conmutador de comandos de Powershell que requieren dos puntos?Powershell: dos puntos en los parámetros del comando

Considere el cmdlet de shell de administración de Exchange 2010 Move-ActiveMailboxDatabase. El modificador Confirm es una System.Management.Automation.SwitchParameter y debe ser utilizado como tal,

Move-ActiveMailboxDatabase -Confirm:$false 

Sin colon el comando no reconoce el interruptor no confirman como tal,

Move-ActiveMailboxDatabase -Confirm $false 

¿Por qué? ¿Cuál es la diferencia que el colon hace allí? ¿Por qué Exchange2010 parece ser la única cosa que noté este comportamiento?

He navegado a través de Powershell en acción y Powershell 2.0, pero no encontré nada sobre esta sintaxis. Sin embargo, la resolución de alcance y los usos de acceso a objetos .Net están documentados en esos libros.

Mi Google-fu encontró un article que afirma que reenvía explícitamente los valores del parámetro de conmutación, pero no explica de qué se trata.

Respuesta

19

Al hacer:

Move-ActiveMailboxDatabase -Confirm $false 

usted no está diciendo Confirm parámetro acepta la $false. Está diciendo -Confirm y también pasa un argumento (separado) al cmdlet con el valor $false.

Dado que Confirm es un interruptor, solo la presencia de -Confirm significa que es verdadero. La ausencia de -Confirm significa que es falsa.

te voy a dar un ejemplo de script:

param([switch]$test) 

write-host Test is $test 

Si sólo ejecuta el script sin argumentos/parametros, es decir .\script.ps1 tiene un resultado:

Test is False 

Si lo ejecuta como .\script.ps1 -test, la salida es

Test is True 

Si la ejecuta como .\script.ps1 -test $false, la salida es

Test is True 

Si lo ejecuta como .\script.ps1 -test:$false la salida es

Test is False 

Es en escenarios en los que el valor de una misma variable de interruptor tiene que ser determinado a partir de otra variable que el : es usado.

Por ejemplo, considere la secuencia de comandos:

param ([boolean]$in) 

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

func -test:$in 

Aquí si se ejecuta como .\script.ps1 -in $false, se obtiene

Test is false 

Si no fueron capaces de utilizar el :, que habría tenido para escribirlo como:

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

No la respuesta completa - No conozco el ejemplo de Buzones, pero en muchos otros casos (por ejemplo, 'Set-SMBServerConfiguration'), el efecto de' -Confirm: $ false' es diferente de su ausencia. Puedo usar '-Confirm: $ false' or' -Force'; de lo contrario, necesito confirmarlo. – Lamarth

4

El colon se puede usar con cada parámetro valor ter, pero es más especial en el caso de los parámetros del interruptor. Los parámetros del interruptor no toman valores, están presentes ($ true) o ausentes ($ false).

Imagine que tiene una función como esta:

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

Y usted llamarlo así:

test-switch -force $false 

Dado que los parámetros del conmutador están presentes o no, $ falsa que en realidad se unen al nombre parámetro. Entonces, ¿cómo vincular un valor a un parámetro de cambio? Con los dos puntos:

test-switch -force:$false 

Ahora la carpeta de parámetros sabe a qué parámetro va el valor.

Cuestiones relacionadas