PowerShell:每个参数集必须至少有一个对于该参数集唯一的参数

PowerShell:每个参数集必须至少有一个对于该参数集唯一的参数,powershell,parameters,Powershell,Parameters,例如,PowerShell文档中说明了此“规则”。 然而,我不确定我是否正确地解释了它。以下内容对我来说似乎很好 function Test-ParameterSets { param( [Parameter(Position = 0, ParameterSetName = "NameName")] [Parameter(Position = 0, ParameterSetName = "NameId")] [string] $A_by_Name,

例如,PowerShell文档中说明了此“规则”。 然而,我不确定我是否正确地解释了它。以下内容对我来说似乎很好

function Test-ParameterSets
{
    param(
    [Parameter(Position = 0, ParameterSetName = "NameName")] 
    [Parameter(Position = 0, ParameterSetName = "NameId")] 
    [string] $A_by_Name, 

    [Parameter(Position = 0, ParameterSetName = "IdName")] 
    [Parameter(Position = 0, ParameterSetName = "IdId")] 
    [int] $A_by_Id,

    [Parameter(Position = 1, ParameterSetName = "NameName")] 
    [Parameter(Position = 1, ParameterSetName = "IdName")] 
    [string] $B_by_Name,

    [Parameter(Position = 1, ParameterSetName = "NameId")] 
    [Parameter(Position = 1, ParameterSetName = "IdId")] 
    [int] $B_by_Id
    )

    write-host "Hello"
}

我误解了吗?还是这条规则过时了?

你的榜样还不够成熟:

function Test-ParameterSets
{
    param(
    [Parameter(Position = 0, ParameterSetName = "NameName")] 
    [Parameter(Position = 0, ParameterSetName = "NameId")] 
    [string] $A_by_Name, 

    [Parameter(Position = 0, ParameterSetName = "IdName")] 
    [Parameter(Position = 0, ParameterSetName = "IdId")] 
    [int] $A_by_Id,

    [Parameter(Position = 1, ParameterSetName = "NameName")] 
    [Parameter(Position = 1, ParameterSetName = "IdName")] 
    [string] $B_by_Name,

    [Parameter(Position = 1, ParameterSetName = "NameId")] 
    [Parameter(Position = 1, ParameterSetName = "IdId")] 
    [int] $B_by_Id
    )


    "ParametetSetName is $($PSCmdlet.ParameterSetName)"
}
这将产生:

Test-ParameterSets : Parameter set cannot be resolved using the specified named parameters.
At line:25 char:1
+ Test-ParameterSets
+ ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Test-ParameterSets], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,Test-ParameterSets

当您有不同的行为或使用不同的参数时,通常使用ParamaterSetName,具体取决于函数用户使用的参数集。规则是正确的。通过使用
CmdletBinding
属性的
DefaultParameterSetName
属性,可以帮助PowerShell确定正在使用的参数集。

仅当您在不指定两个参数的情况下调用它时。如果调用
测试参数sets a b
它将输出
名称
。如果调用
测试参数集0 1
它将输出
IdId
。是的,但PowerShell可以解决这个问题。两个字符串只能是NameName和int,int只能是IdId。没有歧义。PowerShell还使用可能导致混淆的解析参数类型。当所有类型都相同时,参数集中需要一个“唯一”参数。在这种情况下,PowerShell没有其他方法可以用来确定选择了哪个参数集。