tl; др
# Pass the $itNeedsT Boolean - which indicates whether the -T switch should
# be passed - as the switch's *value*.
command -T:$itNeedsTheT
Если $itNeedsTheT
равно $false
, то выше то же самое, что и без -T
- обычно (подробности читайте дальше).
Обратите внимание на необходимость использования :
для отделения имени переключателя от значения.
As boxdog указывает на комментарий, в хеш-таблице, используемой с splatting (@parameters
) , вы используете логическое значение для представления параметра переключателя (флаг-подобный параметр типа [switch]
).
# Dynamically determine if -Recurse should be turned on.
$recurseIfTrue = $true
# Define the hashtable for splatting...
$parameters = @{
Path = '.'
Recurse = $recurseIfTrue # turn the -Recurse switch on or off
}
# ... and pass it to the target command.
# *Loosely speaking*, the following command is the same as either:
# Get-ChildItem -Path '.' -Recurse # if $recuseIfTrue was $true
# or:
# Get-ChildItem -Path '.' # if $recuseIfTrue was $false
Get-ChildItem @parameters
То есть, свободно говоря:
- используйте
$true
to pass switch - используйте
$false
до , а не передавайте переключатель.
Это позволяет вам сохранить одно определение хеш-таблицы, которое безоговорочно включает параметр переключателя, но значение которого может определятьпрограммно.
Предостережение :
Строго говоря, запись хеш-таблицы Recurse = $true
преобразуется в параметр -Recurse:$true
и Recurse = $false
нетперевести в пропуская параметр, он переводит в -Recurse:$false
.
В большинстве случаев, пропуске переключатель -Foo
и передача его со значением $false
- т.е. -Foo:$false
- эквивалент .
Однако команды могут обнаруживает разницу и иногда действует по-другому :
Ярким примером является общий параметр (1089) -Confirm
: пропуск -Confirm
означаетчто предпочтительная переменная $ConfirmPreference
соблюдается, тогда как -Confirm:$false
означает, что переменная предпочтения должна быть переопределена (и подтверждение должно не запрашиваться).
Еслиесли вы хотите сделать это различие самостоятельно в скрипте или функции PowerShell, вы можете вызвать $PSBoundParameters.ContainsKey('Foo')
в дополнение к проверке значения переменной параметра переключателя $Foo
(-Foo
).
Если вы имеете дело стакая команда, и вы хотите программно обеспечить пропуск параметра переключателяter, у вас не будет выбора, кроме как условно добавить запись для этого переключателя на отдельном шаге:
# Dynamically determine if -Recurse should be turned on.
$recurseIfTrue = $true
# A 'Recurse' key now can NOT be included unconditionally,
# if you want to *omit* -Recurse in case $recurseIfTrue is $false
$parameters = @{
Path = '.'
}
# Add a 'Recurse' entry only if the switch should be passed.
if ($recurseIfTrue) {
$parameters.Recurse = $true
}
Get-ChildItem @parameters
Наконец, обратите внимание, что в качестве альтернативы указаниюзначение переключателя программно с помощью сплаттинга, вы можете передать динамическое значение непосредственно переключателю :
# Dynamically determine if -Recurse should be turned on.
$recurseIfTrue = $true
Get-ChildItem -Path . -Recurse:$recurseIfTrue
Обратите внимание: необходимо использовать :
для отделения имени переключателя отего значение .
Это необходимо, потому что использование обычного пробела для отделения имени параметра от его значения заставит PowerShell интерпретировать логическое значение как next аргумент, учитывая, что параметры переключателя обычно не принимают значений .
Хотя этот синтаксис используется редко, он работает с всеми типами параметров.