gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 23:22:52 24 4
gpt4 key购买 nike

我编写了一个使用四个参数和四个参数集的函数。第一个参数 $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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com