Powershell在使用管道时无法解析ParameterSetName

Powershell在使用管道时无法解析ParameterSetName,powershell,Powershell,我有一个cmdlet,带有几个参数集名称。在我使用管道之前,一切正常。代码简化如下 function Test { [CmdletBinding()] Param( [Parameter(Mandatory=$True, Position=0, ValueFromPipeline=$True)] [string]$name, [Parameter(Mandatory = $True, ParameterSetName = "Set1")]

我有一个cmdlet,带有几个参数集名称。在我使用管道之前,一切正常。代码简化如下

function Test 
{ 
    [CmdletBinding()]

    Param(    
    [Parameter(Mandatory=$True, Position=0, ValueFromPipeline=$True)]
    [string]$name,

    [Parameter(Mandatory = $True, ParameterSetName = "Set1")]
    [Parameter(Mandatory = $True, ParameterSetName = "Set2")]
    [string] $P1,

    [Parameter(Mandatory = $True, ParameterSetName = "Set2")]
    [string] $P2
    )

    Write-Output ($name + " - " + $PsCmdlet.ParameterSetName)
}
此函数在以下调用中按预期工作:Test aaa-P1 x、Test aaa-P1 x-P2 y和piped Get ChildItem c:\Temp | select-ExpandProperty Name | select-First 1 | Test-P1 x-P2 y。但是,当我尝试用Set1 Get ChildItem c:\Temp | select-ExpandProperty Name | select-First 1 | Test-P1 x调用它时,它失败了,错误是Dotnet File Quickstart-Set2 测试:无法使用指定的命名参数解析参数集


我知道如何设置DefaultParameterNameSet,但由于我的cmdlet比这个示例更复杂,这对我没有帮助。

似乎是个bug。如果您将、Set1和Set2直接分配给name,那么它将按预期工作。这就好像管道没有考虑AllParameterSets值。[1]是否应该列出默认参数集?[2] 难道所有来自管道的参数都不应该说它们接受管道输入吗?@Lee_Dailey[1]为什么我需要指定默认参数集?[2] 只有第一个参数$name接受来自pipeline@DavidSchuldenfrei-[1]默认参数集-也许我误解了,但我认为只要有多个默认参数集,就应该声明一个默认参数集。[2] 管道输入-抱歉,我误读了你的代码。[脸红]看起来像个虫子。如果您将、Set1和Set2直接分配给name,那么它将按预期工作。这就好像管道没有考虑AllParameterSets值。[1]是否应该列出默认参数集?[2] 难道所有来自管道的参数都不应该说它们接受管道输入吗?@Lee_Dailey[1]为什么我需要指定默认参数集?[2] 只有第一个参数$name接受来自pipeline@DavidSchuldenfrei-[1]默认参数集-也许我误解了,但我认为只要有多个默认参数集,就应该声明一个默认参数集。[2] 管道输入-抱歉,我误读了你的代码。[脸红]