この基本的なパターンに従う引数を受け入れるPowerShell(2.0)スクリプトを作成しようとしています。
.\{script name} [options] PATH
オプションは任意の数のオプションパラメータです。詳細については、「-v」の行に沿って考えてください。 PATH引数は単純に最後に渡される引数であり、必須です。オプションなしで引数を1つだけ持つスクリプトを呼び出すことができ、その引数はパスであると想定されます。オプションのパラメーターのみが含まれているが、定位置ではないパラメーターリストの設定に問題があります。
この簡単なスクリプトは、私が抱えている問題を示しています。
#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:
私が作成しようとしている動作を試行すると、両方の引数がオプションのパラメーターを通過し、最終的に残りのArgs変数になります。
この質問/回答 望ましい動作を実現する方法を提供してくれましたが、少なくとも1つの必須パラメーターがあり、それが来る場合にのみ機能するようです before他のすべての引数。
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
最初の必須の引数が割り当てられ、残っているすべてが完全に処理されます。
問題はこれです:allのparamsがオプションであり、になるようにparamsリストを設定するにはどうすればよいですか?どれも定位置ですか?
これはどう?
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
これはenforceではなく、必須の引数が最後に配置されているか、名前が付けられていません。ただし、必要な基本的な使用パターンについてはallowsです。
また、$Three
に複数の値を指定することもできません。これはあなたが望むものかもしれません。ただし、名前のない複数のパラメータを$Three
の一部として扱う場合は、ValueFromRemainingArguments
属性を追加します。
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]