6

PowerShell 1.0 で、列挙型のコマンドレット パラメーターがある場合、ユーザーがコマンドレット コマンド ラインでそのパラメーターを指定したかどうかをテストするための推奨される方法は何ですか? 例えば:

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 になります。すべてのパラメーターをシードしたり、列挙型にダミー値を追加したりする必要はありません。数百のパラメーターを持つ多くのコマンドレットを潜在的に持っている可能性があります。より良い方法が必要です。これはこの質問に関連していますが、これを行うためのよりクリーンな方法を探していました。ありがとう。

4

6 に答える 6

10

この場合、列挙型の周りに null 許容ラッパーを使用します。

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

? に注意してください。MyEnum の修飾子。次に、次のように設定されているかどうかをテストできます。

if (this.IsEnabled.HasValue) { ... }
于 2009-07-31T03:37:37.657 に答える
4

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

最終的に、これはPowerShellとは関係がなく、.NETの優れたコーディング手法と関係があります。

  • オシーン
于 2009-07-30T03:02:38.017 に答える
2

このスレッドが少し古いことはわかっていますが、これを行う最善の方法は、SwitchParameter 型を使用してパラメーターを宣言することです。次に、ユーザーは -IsEnabled を渡す必要はありません。パラメーターとして -Enabled のようなものを追加するだけです。

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

于 2009-09-30T05:05:15.223 に答える
1

私が見ることができる唯一のことは、値0が不明またはそのような名前になるように列挙型を変更することです。

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

于 2009-07-30T00:20:12.067 に答える
0
bool wasSpecified = MyInvocation.BoundParameters.ContainsKey("IsEnabled");
于 2014-08-15T15:13:07.940 に答える