提问人:Oleksa 提问时间:4/10/2023 更新时间:4/10/2023 访问量:150
无法解析参数集
Parameter set cannot be resolved
问:
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 {}
为什么无法解析第二次调用的参数集?这似乎是完全可以解决的。至少似乎有足够的信息。
答:
2赞
Santiago Squarzon
4/10/2023
#1
您需要添加 DefaultParameterSetName
以避免歧义。在第二个函数调用中,PowerShell 无法判断你是要使用参数集还是 .A
B
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 0
position 1
DefaultParameterSetName = 'A'
Cannot process argument transformation on parameter 'Num'
0赞
Santiago Squarzon
4/10/2023
@Oleksa这是一个非常好的问题,但从理论上讲,引擎应该尝试将脚本块强制成一个,但实际发生的事情是它试图将其绑定到参数,然后跳过它并将其绑定到参数。 是了解 Binder 如何操作的出色 cmdlet:int
-Int
-Script
Trace-Command
Trace-Command -e { f {} } -Name ParameterBinding -PSHost
0赞
Santiago Squarzon
4/10/2023
@Oleksa这也可能是一个错误,但绑定器可能绑定到参数集上的位置,但无法将 的值更新为0
B
$PSCmdlet.ParameterSetName
B
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 {}
评论