web-dev-qa-db-ja.com

Powershell非定位置、オプションのパラメーター

この基本的なパターンに従う引数を受け入れる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リストを設定するにはどうすればよいですか?どれも定位置ですか?

17
Fopedush

これはどう?

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]
30
latkin