назначать параметры powershell только по имени - PullRequest
1 голос
/ 12 марта 2019

Я пишу сценарий powershell, который имеет несколько параметров

param(
  [Parameter(Mandatory=$true, Position=0)]
  [ValidateSet('a', 'b', 'c', 'd')]
  [string] $abcd,

  [Parameter(Mandatory=$true)] [string] $mandatory1,
  [Parameter(Mandatory=$true)] [string] $mandatory2,
  [Parameter()] $optional1=$false,
  [Parameter()] $optional2=$false,
  [Parameter()] $defaulted1=256,
  [Parameter()] $defaulted2=30,
  [Parameter()] [string] $defaulted3='defaulted3',
  [Parameter(ValueFromRemainingArguments=$true)] [string[]] $rest
)

Однако, когда я пытаюсь вызвать его, некоторые параметры присваиваются дополнительным / стандартным значениям вместо $ rest.

.\my-script `
  -abcd a `
  -mandatory1 value1 `
  -mandatory2 value2 `
  -optional1 value3 `
  -optional2 value4 `
  -rest `
    foo `
    bar `
    baz

мой скрипт печатает

optional1 is value3
optional2 is value4
defaulted1 is bar
defaulted2 is baz
rest is foo

Таким образом, похоже, что Powershell предпочитает присваивать аргументы по позиции , даже если они имеют значения по умолчанию, вместо назначения ихValueFromRemainingArguments param.

Есть ли способ изменить это поведение и установить значение необязательного параметра только по имени?

Я пытался использовать Как указать непозиционный параметр в PowerShellscript? и непозиционные, необязательные параметры Powershell но либо я сделал это неправильно, либо он работает не так, как я думал.

1 Ответ

1 голос
/ 12 марта 2019

Добавьте [CmdletBinding(PositionalBinding=$false)] перед ключевым словом param в верхней части скрипта. См. Требование и проверка только для именованных аргументов

Вот пример атрибута параметра, применяемого к вашему коду:

function test {
[cmdletbinding(PositionalBinding=$false)]
param(
[Parameter(Mandatory=$true)]
[ValidateSet('a', 'b', 'c', 'd')]
[string] $abcd,
[Parameter(Mandatory=$true)] [string] $mandatory1,
[Parameter(Mandatory=$true)] [string] $mandatory2,
[Parameter()] $optional1=$false,
[Parameter()] $optional2=$false,
[Parameter()] $defaulted1=256,
[Parameter()] $defaulted2=30,
[Parameter()] [string] $defaulted3='defaulted3',
[Parameter(ValueFromRemainingArguments=$true)] [string[]] $rest
)
$rest
}

test -abcd "a" -mandatory1 "hi" -mandatory2 "hi" "foo" "bar"
foo
bar
test -abcd "a" -mandatory1 "hi" -mandatory2 "hi" -rest foo,bar,baz
foo
bar
baz
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...