无法解析参数集

Parameter set cannot be resolved

提问人:Oleksa 提问时间:4/10/2023 更新时间:4/10/2023 访问量:150

问:

function f {
  param(
    [Parameter(ParameterSetName='A', Position=0)]
    [int] $Num,
    [Parameter(ParameterSetName='A', Position=1)]
    [Parameter(ParameterSetName='B', Position=0)]
    [scriptblock] $Script
  )
}

f 123 {}
f {}

为什么无法解析第二次调用的参数集?这似乎是完全可以解决的。至少似乎有足够的信息。

PowerShell 函数 参数

评论


答:

2赞 Santiago Squarzon 4/10/2023 #1

您需要添加 DefaultParameterSetName 以避免歧义。在第二个函数调用中,PowerShell 无法判断你是要使用参数集还是 .AB

function f {
    [CmdletBinding(DefaultParameterSetName = 'B')]
    param(
        [Parameter(ParameterSetName = 'A', Position = 0)]
        [int] $Num,

        [Parameter(ParameterSetName = 'A', Position = 1)]
        [Parameter(ParameterSetName = 'B', Position = 0)]
        [scriptblock] $Script
    )

    $PSCmdlet.ParameterSetName
}

f 123    # A
f 123 {} # A
f {}     # B

评论

1赞 Oleksa 4/10/2023
为什么仍然有效并且脚本绑定到 if ?因为通常情况下,如果没有任何参数集,它会给出一个错误。f {}position 0position 1DefaultParameterSetName = 'A'Cannot process argument transformation on parameter 'Num'
0赞 Santiago Squarzon 4/10/2023
@Oleksa这是一个非常好的问题,但从理论上讲,引擎应该尝试将脚本块强制成一个,但实际发生的事情是它试图将其绑定到参数,然后跳过它并将其绑定到参数。 是了解 Binder 如何操作的出色 cmdlet:int-Int-ScriptTrace-CommandTrace-Command -e { f {} } -Name ParameterBinding -PSHost
0赞 Santiago Squarzon 4/10/2023
@Oleksa这也可能是一个错误,但绑定器可能绑定到参数集上的位置,但无法将 的值更新为0B$PSCmdlet.ParameterSetNameB
1赞 Darin 4/10/2023 #2

用于明确某些参数集的某些参数是必需的。Mandatory

function f {
    param(
        [Parameter(Mandatory = $true, ParameterSetName = 'A', Position = 0)]
        [int] $Num,
        [Parameter(ParameterSetName = 'A', Position = 1)]
        [Parameter(ParameterSetName = 'B', Position = 0)]
        [scriptblock] $Script
    )
}

f 123 {}
f {}