我有这个PowerShell cmdlet:
function Test-ParameterBinding {
#
# .SYNOPSIS
# Tests parameter binding.
#
[CmdletBinding()]
param (
[Parameter(ParameterSetName = 's1', Mandatory = $true)]
[int] $P1,
[Parameter(ParameterSetName = 's1')]
[Parameter(ParameterSetName = 's2', Mandatory = $true)]
[string] $P2,
[Parameter(ParameterSetName = 's1')]
[Parameter(ParameterSetName = 's3', Mandatory = $true)]
[bool] $P3
)
process { $PSCmdlet }
}
以下是此cmdlet的帮助:
SYNTAX
Test-ParameterBinding -P1 <Int32> [-P2 <String>] [-P3 <Boolean>] [<Com…
Test-ParameterBinding -P2 <String> [<CommonParameters>]
Test-ParameterBinding -P3 <Boolean> [<CommonParameters>]
查看代码并帮助我认为我可以像这样使用cmdlet:
Test-ParameterBinding -P2 'Bind to param set s2'
Test-ParameterBinding -P3 $true # Bind to param set s3
但对于这两个我得到:
Parameter set cannot be resolved using the specified named parameters.
问题1:在我的两种情况下,PowerShell是否应该能够绑定到参数集s2
和s3
?
这意味着没有时间为PowerShell版本2实现它,或者他们没有发现这个问题。
问题2:我的推理是否有问题?参数绑定在这些情况下是否会失败?
我在PowerShell documentation中找到了与我的问题直接相关的内容:
有一种情况是,即使指定了默认参数集名称,Windows PowerShell也无法使用默认参数集。 Windows PowerShell运行时无法仅基于对象类型区分参数集。例如,如果您有一个参数集,其中取一个字符串作为文件路径,另一个集合直接接受FileInfo对象,则Windows PowerShell无法根据传递给cmdlet的值确定要使用的参数集,也不能它使用默认参数集。在这种情况下,即使您指定了默认参数集名称,Windows PowerShell也会抛出不明确的参数集错误消息。
答案 0 :(得分:4)
您的逻辑是正确的,Powershell 应能够根据您的函数定义和示例用法找出参数集。
显然,Powershell v2对此没有足够强大的逻辑。但它在Powershell v3中的预期效果如此,这进一步证实了它是v2中的一个缺点/错误。