Непозиционные, необязательные параметры 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]