これまで、PowerShell スクリプトでパラメーター セットを多かれ少なかれ回避していました。これは、非常に冗長で複雑な依存関係を実装するのが非常に難しいためです。
StackOverflow には同様の質問と回答がいくつかありますが、状況に応じて許容できる解決策または回避策を見つけることができます。実際のスクリプトはさらに複雑ですが、これは私が行き詰まった場合です。
Function Test-ParamSet {
[CmdletBinding(DefaultParameterSetName='Param1')][OutputType([Object[]])]Param (
[Parameter(ParameterSetName = 'Param1', Mandatory = $True)]
[Parameter(ParameterSetName = 'Param1Switch', Mandatory = $True)]
$Param1,
[Parameter(ParameterSetName = 'Param2', Mandatory = $True)]
[Parameter(ParameterSetName = 'Param2Switch', Mandatory = $True)]
$Param2,
[Parameter(ParameterSetName = 'Param3', Mandatory = $True)]
$Param3,
[Parameter(ParameterSetName = 'Param1Switch')]
[Parameter(ParameterSetName = 'Param2Switch')]
[Switch]$Switch1,
[Parameter(ParameterSetName = 'Param1Switch')]
[Parameter(ParameterSetName = 'Param2Switch')]
[Switch]$Switch2
)
Write-Host $PsCmdlet.ParameterSetName
}
パラメータの規則:
- 少なくとも 1 つの
Param#
(Param1
、Param2
またはParam3
) パラメータを指定する必要があります - 1 つの
Param#
(Param1
、Param2
またはParam3
) パラメータのみを指定できます - スイッチ (
Switch1
および) はオプションであり、 orパラメーターSwitch2
でのみ指定できます (一方または両方)。Param1
Param2
次のコマンドはエラーを生成する必要があることを意味します。
Test-ParamSet
Test-ParamSet -Param3 'Test' -Switch1
そして、次のコマンドを受け入れる必要があります。
Test-ParamSet -Param1 'Test'
Test-ParamSet -Param1 'Test' -Switch1
Test-ParamSet -Param2 'Test' -Switch1 -Switch2
問題は次のコマンドにあります。
Test-ParamSet -Param2 'Test'
予期しないエラーが発生します。
Test-ParamSet : Parameter set cannot be resolved using the specified named parameters. One or more parameters issued cannot be used together or an insufficient number of parameters were provided. At line:1 char:1 + Test-ParamSet -Param2 'Test' + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Test-ParamSet], ParameterBindingException + FullyQualifiedErrorId : AmbiguousParameterSet,Test-ParamSet
これは、パラメーターのスローメッセージをどのように変更しますか?で@mklement0が言及したこの github の問題に関連していると思います。.
しかし、パラメーターセットを使用してこれを適切に解決または回避するにはどうすればよいですか?