Powershell: двоеточие в параметрах командлета - PullRequest
12 голосов
/ 15 декабря 2011

Как обстоят дела с параметрами переключателя командлетов Powershell, для которых требуется двоеточие?

Рассмотрим командлет оболочки управления Exchange 2010 Move-ActiveMailboxDatabase .Переключатель подтверждения - System.Management.Automation.SwitchParameter и должен использоваться следующим образом:

Move-ActiveMailboxDatabase -Confirm:$false

Без двоеточия команда не может распознать переключатель не подтверждать следующим образом:

Move-ActiveMailboxDatabase -Confirm $false

Это почему?Какая разница, что толстая кишка делает там?Почему Exchange2010, кажется, является единственной вещью, которую я заметил, это поведение?

Я просматривал Powershell в Action и Powershell 2.0, но ничего не нашел об этом синтаксисе.Разрешение области действия и использование доступа к объектам .Net описаны в этих книгах.

Мой Google-фу обнаружил статью , в которой утверждается, что он явно перенаправляет значения параметров переключения, но не объясняет, что этоо.

Ответы [ 2 ]

21 голосов
/ 16 декабря 2011

Когда вы делаете:

Move-ActiveMailboxDatabase -Confirm $false

Вы не говорите, Confirm параметр принимает $false. Вы говорите -Confirm, а также передаете (отдельный) аргумент командлету со значением $false.

Поскольку Confirm является переключателем, наличие -Confirm означает, что оно истинно. Отсутствие -Confirm означает, что это ложно.

Позвольте привести пример сценария:

param([switch]$test)

write-host Test is $test

Если вы просто запустите скрипт без каких-либо аргументов / параметров, т.е. .\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 }
6 голосов
/ 16 декабря 2011

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

Представьте, что у вас есть такая функция:

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

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

test-switch -force $false

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

test-switch -force:$false

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...