31

シナリオ

  • Visual Studio 2008 と .NET 3.5 を使用して、Powershell 2.0 のコマンドレットを作成しています。
  • コマンドレットには 3 つの引数が必要です。

コマンドレットの意図した文法は次のようなものです。

cmdletname [foo|bar] p1, p2
  • ユーザーは「-foo」または「-bar」の値を指定する必要がありますが、両方を一緒に指定することはできません。

有効な入力の例

cmdletname -foo xxx -p1 hello  -p2 world
cmdletname -bar yyy -p1 hello  -p2 world

無効な入力の例

cmdletname -foo xxx -bar yyy -p1 hello  -p2 world

私の質問

  • 私の質問は、powershellでこれを行う方法についてです。これにより、すべてのチェックが行われるようになります-または、それが可能かどうか。
  • foo と bar の 2 つのオプション パラメータを使用して、手動でエラー チェックを行うだけでよいことはわかっています。それが私が現在実装している方法です。
  • あるいは、さまざまなアプローチの提案に興味があります。
4

3 に答える 3

57

parameter 属性を使用して、複数のパラメーター セットを宣言できます。次に、相互に排他的なパラメーターを異なるパラメーター セットに割り当てるだけです。

編集:

これは「about_Functions_Advanced_Parameters」の「ParameterSetName Named Argument」セクションにも記載されています。これは、さまざまなパラメーターのセットが次のようなコマンドレットで処理される方法ですGet-Random(相互に排他的なパラメーターがあります)。

> get-random -input 4 -max 77
Get-Random : Parameter set cannot be resolved using the specified named parameters.
At line:1 char:11
+ get-random <<<<  -input 4 -max 77
    + CategoryInfo          : InvalidArgument: (:) [Get-Random], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.PowerShell.Commands.GetRandomCommand

関数でそれを行う例を次に示します。

function exclusive_params() { 
    param( 
        [parameter(ParameterSetName="seta")]$one,
        [parameter(ParameterSetName="setb")]$two, 
        $three 
    )
    "one: $one"; "two: $two"; "three: $three" 
}

パラメーターonetwoは異なるパラメーター セットにあるため、一緒に指定することはできません。

> exclusive_params -one foo -two bar -three third
exclusive_params : Parameter set cannot be resolved using the specified named parameters.
At line:1 char:17
+ exclusive_params <<<<  -one foo -two bar -three third
    + CategoryInfo          : InvalidArgument: (:) [exclusive_params], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,exclusive_params

これは、Get-Random で発生したのと同じエラーです。ただし、パラメーターを個別に使用できます。

> exclusive_params -one foo -three third
one: foo
two:
three: third

...また:

> exclusive_params -two bar -three third
one:
two: bar
three: third
于 2009-11-19T23:20:59.320 に答える
7

ここに来ましたが、追加の要件があります。オプションの相互排他パラメーターです。

この投稿は、答えの半分を見つけるのに役立ちました。したがって、誰かが同じ要件を持っている場合に備えて、ここに完全な回答を投稿することを考えました。

以下のコードを Powershell スクリプトの先頭で使用して、4 つのオプション パラメータを指定できます。その中で、LaunchAsAdmin と LaunchAsCouponBrowser は相互に排他的ですが、token と WorkstationName もオプションですが、他のパラメータと組み合わせることができます。

[CmdletBinding(DefaultParametersetName="default")]                  
Param(
    [string]$token,
    [string]$WorkstationName,
    [parameter(ParameterSetName="seta")][switch]$LaunchAsAdmin,
    [parameter(ParameterSetName="setb")][switch]$LaunchAsCouponBrowser  
)
于 2018-07-11T15:49:42.587 に答える