を使用して検証されたオプションのパラメーターを受け取る PowerShell 関数があり、ValidateSetAttribute
その値に基づいて別の動的パラメーターを追加します。ただし、厳密モードでは、ブロック内のパラメーターにアクセスしようとすると、そのパラメーターをDynamicParam
明示的に設定していないと、変数が定義されていないというエラーが発生します。
Param(
[Parameter()]
[ValidateSet('A', 'B')]
[string] $Target = 'A'
)
DynamicParam {
if ($Target -eq 'B') { # <- Here it fails
# Add new parameter here...
}
}
end {
Write-Host $Target
}
スクリプトは、A
またはB
を最初のパラメーターとして呼び出すと機能しますが、パラメーターを省略すると失敗します。興味深いことに、パラメーター定義からParameterAttribute
またはを削除すると、機能します。ValidateSetAttribute
私の現在の回避策は、次のように、を使用して変数にアクセスし$PSBoundParameters
、パラメーターが設定されているかどうかを確認することです。
if ($PSBoundParameters.ContainsKey('Target') -and $PSBoundParameters.Target -eq 'B') {
# Add new parameter here...
}
A
これは正常に機能しますが、代わりに値を確認したい場合は、1 つの欠点A
があります。パラメーターの既定値$PSBoundParameters
と同様に、パラメーターが省略され、既定値が適用されると、追加されません。したがって、チェックを変更して、次のことを明示的にチェックする必要があります。
if (-not $PSBoundParameters.ContainsKey('Target') -or $PSBoundParameters.Target -eq 'A')) {
# Add new parameter here...
}
このソリューションは、動的パラメーターの追加をデフォルト値と不必要に結びつけるので、あまり好きではありません。理想的には、他に何も触れずにデフォルト値を変更できるようにしたいと考えています。DynamicParam
ブロック内から実際のパラメータ値にアクセスする方法はありますか? または、少なくともパラメーター定義にアクセスしてデフォルト値にアクセスする可能性はありますか?