20

この基本的なパターンに従う引数を受け入れる powershell (2.0) スクリプトを作成しようとしています。

.\{script name} [options] PATH

options は、任意の数のオプションのパラメーターです。詳細については、「-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:

私が作成しようとしている動作では、両方の引数がオプションのパラメーターを通過し、remainingArgs 変数になります。

この質問/回答は、目的の動作を実現する方法を提供してくれましたが、少なくとも 1 つの必須パラメーターがあり、それが他のすべての引数の 前にある場合にのみ機能するようです。

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

最初の必須の引数が割り当てられ、残ったものはすべて失敗します。

問題は次のとおりです。すべてのパラメーターがオプションであり、いずれも位置指定されないようにパラメーター リストを設定するにはどうすればよいですか?

4

1 に答える 1

36

これはどう?

function test
{
   param(
      [string] $One,

      [string] $Two,

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

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

OneTwoはオプションであり、名前でのみ指定できます。 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

これは、必須の引数が最後に配置されていること、または名前が付けられていないことを強制しません。ただし、必要な基本的な使用パターンは可能です。

また、 で複数の値を使用することもできません$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]
于 2012-09-11T20:43:39.657 に答える