PowerShell中的参数绑定问题

nwsw7zdq  于 2023-01-26  发布在  Shell
关注(0)|答案(1)|浏览(156)

我有这个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是否可以绑定到参数集s2s3

这意味着没有时间为PowerShell版本2实现它,或者他们没有发现这个问题。

**问题2:**我的推理有什么问题吗?在这些情况下参数绑定应该失败吗?

我在PowerShell documentation中发现了一些可能与我的问题直接相关的内容:
在一种情况下,即使指定了默认参数集名称,Windows PowerShell也无法使用默认参数集。Windows PowerShell运行时无法仅根据对象类型区分参数集。例如,如果一个参数集采用字符串作为文件路径,而另一个参数集直接采用FileInfo对象,Windows PowerShell无法根据传递给cmdlet的值确定要使用哪个参数集,也不会使用默认参数集。在这种情况下,即使指定默认参数集名称,Windows PowerShell也会引发不明确的参数集错误消息。

hi3rlvi2

hi3rlvi21#

您的逻辑是正确的,Powershell * 应该 * 能够根据您的函数定义和示例用法计算出参数集。
显然Powershellv 2没有足够健壮的逻辑来实现这一点,但它在Powershellv 3中的工作与预期的一样,这进一步证实了它是v2中的一个缺点/bug。

相关问题