2009-07-29 4 views
5

PowerShell 1.0では、enum型のコマンドレットパラメータがある場合、ユーザーがコマンドレットコマンドラインでそのパラメータを指定したかどうかをテストするための推奨方法は何ですか?例:PowerShellコマンドレットパラメータの値が指定されているかどうかを確認する方法を教えてください。

MyEnum : int { No = 0, Yes = 1, MaybeSo = 2 } 

class DoSomethingCommand : PSCmdlet 
... 
private MyEnum isEnabled; 

[Parameter(Mandatory = false)] 
public MyEnum IsEnabled 
{ 
    get { return isEnabled; } 
    set { isEnabled = value; } 
} 

protected override void ProcessRecord() 
{ 
    // How do I know if the user passed -IsEnabled <value> to the cmdlet? 
} 

これは、isEnabledにダミー値を設定しなければならない方法はありますか?デフォルトでは0になり、すべてのパラメータを設定したり、列挙型にダミー値を追加する必要はありません。私は潜在的に多くのコマンドレットと100のパラメータを持っています。より良い方法が必要です。これはthis questionに関連していますが、私はこれを行うよりきれいな方法を探していました。おかげさまで

+0

@Jackストロー あなたは、「パラメータの100年代と潜在的に持って多くのコマンドレット」を持っている場合は、その機能アップの一部を壊すで見たいと思うかもしれません。 PowerShellの主な利点の1つは検出可能性であり、多数のパラメータを持つことで、自己発見がはるかに難しくなります。 –

+0

@スティーブン、申し訳ありませんが、誤解を招いているかもしれません.100種類のパラメータを持つ各コマンドレットではありません:)しかし、多くのパラメータをもたらす多くのコマンドレットです。ご意見ありがとうございます。 –

答えて

8

ここで、Iは、例えば、列挙型の周囲にNULL可能ラッパーを使用します

注意してください? MyEnum上の修飾子。それはそうのように設定されているなら、あなたはテストすることができます。

if (this.IsEnabled.HasValue) { ... } 
+0

これはまさに私が探していたものです。ありがとう。私は実際にはローカル変数を作成し、nullable型ではなくプロパティも作成しました。 –

1

私が見ることができるのは、enumを変更して、値0の名前をUnknownなどとすることだけです。

問題は、列挙型はバックグラウンドでは整数であり、整数は値型であるという点です。残念なことに、彼らは価値を持つ必要があり、その価値はデフォルトで0です。

+0

@ジョゼップ、ありがとう、私はポイントを参照してください。 x0nへの私のコメントを見てください。 –

4

PowerShellを除いて、そのように0を使用するのは決して良いスタイルではありません。最も適切なデフォルトには常に0を使用する必要があります。この場合、最も適切なデフォルトは「Unset」のようなものにする必要があります。

最終的には、これはPowerShellや.NETの優れたコーディング慣行とは関係ありません。

  • Oisin
+0

@ x0n:ありがとうございます。 enum値に0または0を使用するかどうかは議論の余地がありますが、どちらの方法でも既存の製品にはenumの値が0になります。私はより広い質問があると思います。これはパターンのコマンドレット開発者がこの状況で使用するパターンですか? ProcessRecord()内のオブジェクトにパラメータ値を適用する前に、各パラメータにデフォルトの「未指定」の値を使用し、それに対してテストしますか?これは、多くのパラメータタイプを持つ大規模な製品では扱いにくいことがあります。 –

+2

PowerShellのv2.0では、新しいプロパティが追加されました:this.MyInvocation.BoundParameters "this"はPSCmdletです。これは、コマンドレットにバインドされたパラメータ名と値のキー/値のペアのハッシュテーブルです。あなたのenumが指定されていれば、この辞書に入ります。それがデフォルトになっていれば、それはそこにはありません。私はv1.0で同じことをする文字列ハッキング以外のことを知らない – x0n

+0

x0n、ありがとう、私は2.0のプロパティを見た。残念ながら、私は今は1.0に対してコード化する必要があります。私は以下のキーレスの答えは、null可能なラッパーを使って、私が探しているものだと思っています。 –

1

を、私はこのスレッドが今少し古いですけど、これを行うための最善の方法は、SwitchParameterタイプを使用してパラメータを宣言することです。その後、ユーザーは-IsEnabledを渡す必要はなく、-Enabledのようなものをパラメータとして追加するだけです。

パラメータの.IsPresentプロパティをテストして、呼び出し元が追加されたかどうかを確認します(コマンドレットの呼び出しに有効)。

+0

@ダーレン:それは間違いなくbool paramsで動作しますが、オプションの非bool paramsの解決策を探していました。 null可能な型はうまくいくようです。もちろん、PS v2にはコマンドレットで使用できるparamsの辞書が用意されているので、これはおそらく行く方法です。ありがとう。 –

0
bool wasSpecified = MyInvocation.BoundParameters.ContainsKey("IsEnabled"); 
+0

これは、位置パラメータでは正しく動作しないことに注意してください。それらは、BoundParametersのNameでは見つかりませんが、指定され、値を持ちます。 –

関連する問題