powershell - "Parameter set cannot be resolved"当管道参数与其他参数的特定组合时

标签 powershell pipeline parameter-sets

我编写了一个使用四个参数和四个参数集的函数。第一个参数 $Path 未分配给一个集合,因此属于所有集合。它也是强制性的,并且是唯一可以从管道传递的参数。但是,当我在管道末端调用函数时使用其他三个参数的某些组合(所有这些参数都属于四个集合的某些组合)执行此操作时,我收到一条错误消息,指示该集合不明确。

这是我的功能:

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

但这两种组合会导致错误:

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$OutputMode 时会出现集合 B,仅此而已。那么 "C:\Test.jpg"| 是怎么回事? Foo-Bar -OutputMode 1 是否被认为是不明确的?

如果有人能为我阐明这一点,我将不胜感激。

最佳答案

别问我为什么
(下面的解决方法返回相同的语法:Foo-Bar -?)
就个人而言,我发现参数集非常困惑和冗长(因此我这样做是为了 Hierarchical Parameter Scripting #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

关于powershell - "Parameter set cannot be resolved"当管道参数与其他参数的特定组合时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67715580/

相关文章:

python - 如何从 sklearn 中的 ColumnTransformer/Pipeline 中排除特定列?

PowerShell 无法确定正在使用的参数集

powershell - 嵌套循环抽象

ios - PowerShell [System.IO.StreamWriter] 写入控制台(Write-Host)?

python - 使用索引器和编码器时出现 PySpark 管道错误

python - 自定义转换器添加附加列

powershell - 如何支持多个互斥的参数?

powershell - 有没有办法定义一个无参数的powershell参数集?

powershell - 在正在运行的 powershell 作业中写入外部数组

regex - 替换文件中的文本+可选换行符