0

これまで、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#( Param1Param2またはParam3) パラメータを指定する必要があります
  • 1 つのParam#( Param1Param2またはParam3) パラメータのみを指定できます
  • スイッチ (Switch1および) はオプションであり、 orパラメーターSwitch2でのみ指定できます (一方または両方)。Param1Param2

次のコマンドはエラーを生成する必要があることを意味します。

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 の問題に関連していると思います。.

しかし、パラメーターセットを使用してこれを適切に解決または回避するにはどうすればよいですか?

4

2 に答える 2