PowerShell Cmdletパラメーター値が指定されているかどうかを確認するにはどうすればよいですか?
-
05-07-2019 - |
質問
PowerShell 1.0では、enum型のコマンドレットパラメーターがある場合、ユーザーがコマンドレットコマンドラインでそのパラメーターを指定したかどうかをテストするための推奨方法は何ですか?例:
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に等しくなり、すべてのパラメーターをシードしたり、列挙値にダミー値を追加したりする必要はありません。数百のパラメーターを持つ多くのコマンドレットを潜在的に持っていますが、もっと良い方法があります。これは、この質問に関連していますが、よりクリーンな方法を探していました。 ありがとう。
解決
この場合、列挙型の周りにヌル可能なラッパーを使用します。
[Parameter(Mandatory = false)]
public MyEnum? IsEnabled { get; set; }
注意してください? MyEnumの修飾子。その後、次のように設定されているかどうかをテストできます。
if (this.IsEnabled.HasValue) { ... }
他のヒント
PowerShellはさておき、そのように0を使用するのは決して良いスタイルではありません。最も適切なデフォルトには常に0を使用する必要があります。この場合、最も適切なデフォルトは&quot; Unset&quot;のようなものでなければなりません。
最終的には、これはPowerShellとは無関係であり、.NETの優れたコーディング慣行とは関係ありません。
- オイシン
オプションとして、 $ PSBoundParameters
コレクションを使用して、メソッドに渡されたかどうかを確認します。
次のようなjsonファイルがあるとしましょう。{&quot; p1&quot ;:&quot; value1&quot ;,&quot; p2&quot ;:&quot; value2&quot; } パラメータ p1
および p2
を受け入れる関数を作成し、 p1
および p2 <の値を更新します。 / code>をファイルに追加します(関数に渡される場合)。これらの値は
null
である可能性があり、それらの値をnullにすることは、それらを渡さないことと同等ではないとしましょう。
たとえば、 Update-Values -p1 $ null
は p1
を null
に更新し、 p2
を変更しないでください。
そのためには、パラメーターがメソッドに渡されたかどうかを検出できる必要があります。
例-値としてnullを受け入れることができるオプションのパラメーターについて、パラメーターが渡されたかどうかを検出する方法?
Function Update-Values ($p1, $p2) {
If($PSBoundParameters.ContainsKey("p1")) {
Write-Host "p1 passed"
}
else {
Write-Host "p1 not passed"
}
If($PSBoundParameters.ContainsKey("p2")) {
Write-Host "p2 passed"
}
else {
Write-Host "p2 not passed"
}
}
次に、次のパラメーターを使用して関数を実行する場合:
Update-Values -p1 $null
# Update-Values -p1 "something"
結果として、以下が表示されます。
p1 passed
p2 not passed
次のブログ投稿を読むことができます:パラメータがPowershell Cmdletに渡されるかどうかを判断する方法。
唯一目に見えるのは、値0の名前がUnknownまたはそのようなものになるように列挙型を変更することです。
問題は、enumはバックグラウンドでの整数であり、整数は値型であるということです。不幸な結果は、彼らが値を持っている必要があり、その値はデフォルトで0であるということです。
このスレッドはもう少し古くなっていますが、これを行う最善の方法は、SwitchParameter型を使用してパラメーターを宣言することです。その後、ユーザーは-IsEnabledを渡す必要がなく、パラメーターとして-Enabledのようなものを追加するだけです。
次に、パラメーターの.IsPresentプロパティをテストして、呼び出し元がコマンドレットの呼び出しに-Enabledを追加したかどうかを確認します。
bool wasSpecified = MyInvocation.BoundParameters.ContainsKey("IsEnabled");