2

4 つのパラメーターと 4 つのパラメーター セットを使用する関数を作成しました。最初のパラメーター$Pathはセットに割り当てられていないため、すべてのセットに属します。これも必須であり、パイプラインから渡すことができる唯一のパラメーターです。ただし、パイプラインの最後で関数を呼び出すときに、他の 3 つのパラメーターの特定の組み合わせ (これらはすべて、4 つのセットの組み合わせに属します) を使用してこれを行うと、セットがあいまいであることを示すエラーが発生します。

これが私の機能です:

function Foo-Bar {
    [CmdletBinding(DefaultParameterSetName = 'A')]

    param (
        [Parameter(Mandatory = $true,
            ValueFromPipeline = $true)]
        [ValidateNotNullOrEmpty()]
        [string[]] $Path,

        [Parameter(ParameterSetName = 'A')]
        [Parameter(ParameterSetName = 'A-Secure')]
        [Switch] $OutputToConsole,

        [Parameter(Mandatory = $true,
            ParameterSetName = 'B')]
        [Parameter(Mandatory = $true,
            ParameterSetName = 'B-Secure')]
        [int] $OutputMode,

        [Parameter(Mandatory = $true,
            ParameterSetName = 'A-Secure')]
        [Parameter(Mandatory = $true,
            ParameterSetName = 'B-Secure')]
        [Switch] $Login
    )

    $PSCmdlet.ParameterSetName
}

パラメータのすべての可能な組み合わせは次のとおりです。

PS C:\> Foo-Bar -Path "C:\Test.jpg"
A
PS C:\> Foo-Bar -Path "C:\Test.jpg" -OutputToConsole
A
PS C:\> Foo-Bar -Path "C:\Test.jpg" -OutputToConsole -Login
A-Secure
PS C:\> Foo-Bar -Path "C:\Test.jpg" -Login
A-Secure
PS C:\> Foo-Bar -Path "C:\Test.jpg" -OutputMode 1
B
PS C:\> Foo-Bar -Path "C:\Test.jpg" -OutputMode 1 -Login
B-Secure

パイプラインのみで $Path を渡すか、これらの他のパラメーターの組み合わせを使用して渡すと、正常に機能します。

PS C:\> "C:\Test.jpg" | Foo-Bar
A
PS C:\> "C:\Test.jpg" | Foo-Bar -OutputToConsole
A
PS C:\> "C:\Test.jpg" | Foo-Bar -OutputToConsole -Login
A-Secure
PS C:\> "C:\Test.jpg" | Foo-Bar -OutputMode 1 -Login
B-Secure

ただし、次の 2 つの組み合わせはエラーになります。

PS C:\> "C:\Test.jpg" | Foo-Bar -Login
Foo-Bar: 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.
PS C:\> "C:\Test.jpg" | Foo-Bar -OutputMode 1
Foo-Bar: 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.

これらの結果の最大の違いは$OutputToConsole、両方のセットでオプションである唯一のパラメーターであるようです。必須パラメーターをパイプすると、それ自体が必須になるようです。一方、最も紛らわしい結果には が含ま$OutputModeれます。これは、両方のセットが排他的に必須のパラメーターの異なる組み合わせを使用するためです。$Pathと の両方を使用するとセット B が発生し$OutputMode、それだけです。では、"C:\Test.jpg" | Foo-Bar -OutputMode 1なぜあいまいと見なされているのでしょうか。

私のためにこれに光を当てることができる人にとても感謝しています.

4

3 に答える 3

4

理由は聞かないでください。
(以下の回避策は、次の場合と同じ構文を返します:)Foo-Bar -?個人的には、パラメーター セットは静かで紛らわしく冗長だと思います (したがって、階層パラメーター スクリプト
でこの目的を果たしました) 。#13746

とにかく、可能な回避策として; Pathパラメータをすべてのパラメータセットに入れます。

function Foo-Bar {
    [CmdletBinding(DefaultParameterSetName = 'A')]

    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'A')]
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'B')]
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'A-Secure')]
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'B-Secure')]
        [ValidateNotNullOrEmpty()]
        [string[]] $Path,

        [Parameter(ParameterSetName = 'A')]
        [Parameter(ParameterSetName = 'A-Secure')]
        [Switch] $OutputToConsole,

        [Parameter(Mandatory = $true, ParameterSetName = 'B')]
        [Parameter(Mandatory = $true, ParameterSetName = 'B-Secure')]
        [int] $OutputMode,

        [Parameter(Mandatory = $true, ParameterSetName = 'A-Secure')]
        [Parameter(Mandatory = $true, ParameterSetName = 'B-Secure')]
        [Switch] $Login
    )

    $PSCmdlet.ParameterSetName
}

"C:\Test.jpg" | Foo-Bar -Login
A-Secure
于 2021-05-27T07:26:48.833 に答える