Непозиционные, необязательные параметры Powershell

Я пытаюсь создать сценарий powershell (2.0), который будет принимать аргументы, следующие этому базовому шаблону:

.{script name} [options] PATH

где параметры-любое количество дополнительных параметров-подумайте о строках '-v ' для подробного. Аргумент PATH будет просто любым аргументом, переданным последним, и является обязательным. Можно вызвать сценарий без опций и только с одним аргументом, и этот аргумент будет считаться путем. У меня возникли проблемы с настройкой списка параметров это содержит только необязательные параметры, но также является непозиционным.

этот быстрый скрипт демонстрирует проблему, с которой я сталкиваюсь:

#param test script
Param(
    $firstArg,
    $secondArg,
    [switch]$thirdArg,
    [Parameter(ValueFromRemainingArguments = $true)]
    $remainingArgs)

write-host "first arg is $firstArg"
write-host "second arg is $secondArg"
write-host "third arg is $thirdArg"
write-host "remaining: $remainingArgs"

когда назвал так:

.param-test.ps1 firstValue secondValue

скрипт выводит:

first arg is firstValue
second arg is secondValue
third arg is False
remaining:

поведение я попытка для создания оба аргумента будут проходить через необязательные параметры и заканчиваться переменной remainingArgs.

вопрос/ответ услужливо предоставил чтобы добиться желаемого поведения, но это только кажется, работает, если есть хотя бы один обязательный параметр, и только если речь идет до все остальные аргументы.

Я могу продемонстрировать это поведение, сделав firstArg обязательным и указав позицию 0:

#param test script
Param(
    [Parameter(Mandatory=$true, Position = 0)]
    $firstArg,
    $secondArg,
    [switch]$thirdArg,
    [Parameter(ValueFromRemainingArguments = $true)]
    $remainingArgs)

    write-host "first arg is $firstArg"
    write-host "second arg is $secondArg"
    write-host "third arg is $thirdArg"
    write-host "remaining: $remainingArgs"

выполнить с тем же входом, что и раньше:

.param-test.ps1 firstValue secondValue

вывод выглядит следующим образом:

first arg is firstValue
second arg is
third arg is False
remaining: secondValue

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

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

1 ответов


как насчет этого?

function test
{
   param(
      [string] $One,

      [string] $Two,

      [Parameter(Mandatory = $true, Position = 0)]
      [string] $Three
   )

   "One = [$one]  Two = [$two]  Three = [$three]"
}

One и Two являются необязательными и могут быть указаны только название. Three является обязательным и может быть предоставлен без имени.

работы:

test 'foo'
    One = []  Two = []  Three = [foo]
test -One 'foo' 'bar'
    One = [foo]  Two = []  Three = [bar]
test 'foo' -Two 'bar'
    One = []  Two = [bar]  Three = [foo]

это плохо:

test 'foo' 'bar'
test : A positional parameter cannot be found that accepts argument 'bar'.
At line:1 char:1
+ test 'foo' 'bar'
+ ~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [test], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,test

это не исполнение что ваш обязательный arg помещается последним или что он не назван. Но это!--21-->позволяет для основного шаблона использования, который вы хотите.

он также делает не допускайте более одного значения в $Three. Это может быть то, чего ты хочешь. Но, если вы хотите рассматривать несколько неназванных параметров как часть $Three, затем добавьте .

function test
{
   param(
      [string] $One,

      [string] $Two,

      [Parameter(Mandatory = $true, Position = 0, ValueFromRemainingArguments = $true)]
      [string] $Three
   )

   "One = [$one]  Two = [$two]  Three = [$three]"
}

теперь такие вещи, как эта работа:

test -one 'foo' 'bar' 'baz'
  One = [foo]  Two = []  Three = [bar baz]

или даже

test 'foo' -one 'bar' 'baz'
    One = [bar]  Two = []  Three = [foo baz]