2011-12-15 4 views
9

В чем дело с параметрами ключа командной строки Powershell, для которых требуется двоеточие?Powershell: Colon in commandlet parameters

Рассмотрите командлет оболочки управления Exchange 2010 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.

С 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

Не полный ответ. Я не знаю пример почтовых ящиков, но во многих других случаях (например, 'Set-SMBServerConfiguration') эффект' -Confirm: $ false' отличается от его отсутствия. Я могу использовать '-Confirm: $ false' или' -Force', иначе мне нужно подтвердить. – Lamarth

4

Двоеточие может использоваться с каждым параметром ter, но является более особенным в случае параметров переключателя. Параметры переключателя не принимают значения, они либо присутствуют ($ true), либо отсутствуют ($ false).

Представьте, что вы имеете такую ​​функцию:

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

И вы называете это так:

test-switch -force $false 

Поскольку параметры коммутатора либо присутствуют или нет, $ False фактически привязывается к имени параметр. Итак, как вы привязываете значение к параметру switch? С толстой кишкой:

test-switch -force:$false 

Теперь связующее значение параметра знает, к какому параметру относится значение.

Смежные вопросы