Как передать параметр переключателя как переменную / через сплаттинг в PowerShell? - PullRequest
2 голосов
/ 22 октября 2019

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

$parameters = @{
    name = "John"
    last_name = "Doe"
}

Но если команда или сценарий действительно ожидают -Tчтобы указать что-то вроде флага, но сам параметр не требует значения. Как я могу установить это в переменной?

$optionalT = ""
if ($itNeedsTheT) $optionalT = "-T"

command $optionalT

Если я делаю это так, он жалуется на следующее сообщение:

Unknown argument 'T' on command line.

Ответы [ 2 ]

2 голосов
/ 22 октября 2019

При создании сплаттинга создайте хеш-таблицу с безусловными параметрами (значения могут быть переменными), но добавьте необязательные параметры после создания хеш-таблицы:

$parameters = @{
  Name = "John"
  LastName = "Doe"
  Age = $age
  Enabled = $true
}

if( $favoriteThing ){
  $parameters.FavoriteThing = $favoriteThing
}

command @parameters

Если вы работаете с переключателем в сплаттинге,вы можете рассматривать его как логический параметр, как показано выше, просто присвойте ему значение $true или $false в зависимости от того, хотите ли вы, чтобы коммутатор был включен в команде или нет. Вы можете видеть пример этого без указания знака, чтобы установить флаг -Confirm на $false:

Install-Package some_package -Confirm:$false
1 голос
/ 22 октября 2019

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 аргумент, учитывая, что параметры переключателя обычно не принимают значений .

Хотя этот синтаксис используется редко, он работает с всеми типами параметров.

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