PowerShell 中的多组相互排斥的参数:为什么这是模棱两可的?

Sets of mutually exclusive parameters in PowerShell: Why is this ambiguous?

我一直在尝试让多组互斥起作用。 我希望“宽度”与“WidthReset”互斥,“高度”与“HeightReset”互斥。

cmdlet 的帮助显示:

    Get-ArgTest [-Width <int>] [-Height <int>]  [<CommonParameters>]
    Get-ArgTest [-Width <int>] [-HeightReset]  [<CommonParameters>]
    Get-ArgTest [-Height <int>] [-WidthReset]  [<CommonParameters>]
    Get-ArgTest [-WidthReset] [-HeightReset]  [<CommonParameters>]

看下面的代码。

一切正常,但Get-ArgTest -WidthReset似乎有歧义。

为什么这个案例有歧义? 其他对称情况不会被标记为不明确。

如何解决歧义?

将 DefaultParameterSetName 更改为 B 或 C 会改变大小写不明确。

这表明它应该有效。

##########################################
# This cmdlet *should* accept
# [-Width | -WidthReset] [-Height | -HeightReset]
##########################################
function Get-ArgTest
{
  [CmdletBinding(DefaultParameterSetName = 'A')]
    param(
            [Parameter(ParameterSetName='A')]
            [Parameter(ParameterSetName='B')]
            [int] $Width,

            [Parameter(ParameterSetName='C')]
            [Parameter(ParameterSetName='A')]
            [int] $Height,

            [Parameter(ParameterSetName='C')]
            [Parameter(ParameterSetName='D')]
            [switch] $WidthReset,

            [Parameter(ParameterSetName='B')]
            [Parameter(ParameterSetName='D')]
            [switch] $HeightReset
    )

    Write-Output "HELLO, Width=$Width, Height=$Height, WidthReset=$WidthReset, HeightReset=$HeightReset"
}

##########################################
# Tests
##########################################
# First, display HELP
Get-ArgTest -?

####
## Try each combination
# First, just the values
Get-ArgTest 
Get-ArgTest -Width 2
Get-ArgTest          -Height 4
Get-ArgTest -Width 2 -Height 4

# Values and the opposite reset
Get-ArgTest -Width 2                         -HeightReset
Get-ArgTest          -Height 4   -WidthReset

# The Resets
Get-ArgTest                      -WidthReset -HeightReset
Get-ArgTest                      -WidthReset -HeightReset:$False
Get-ArgTest                      -WidthReset:$False -HeightReset:$True

# I cannot get the following cases to work :-(
Get-ArgTest                      -WidthReset
Get-ArgTest                                  -HeightReset

为避免歧义,在您的 D 参数集中使 -WidthReset-HeightReset 强制

function Get-ArgTest
{
  [CmdletBinding(DefaultParameterSetName = 'A')]
    param(
            [Parameter(ParameterSetName='A')]
            [Parameter(ParameterSetName='B')]
            [int] $Width,

            [Parameter(ParameterSetName='C')]
            [Parameter(ParameterSetName='A')]
            [int] $Height,

            [Parameter(ParameterSetName='C')]
            [Parameter(ParameterSetName='D', Mandatory)]
            [switch] $WidthReset,

            [Parameter(ParameterSetName='B')]
            [Parameter(ParameterSetName='D', Mandatory)]
            [switch] $HeightReset
    )

    Write-Output "HELLO, Width=$Width, Height=$Height, WidthReset=$WidthReset, HeightReset=$HeightReset"
}

这导致以下语法图 (Get-Command -Syntax Get-ArgTest):

Get-ArgTest [-Width <int>] [-Height <int>] [<CommonParameters>]

Get-ArgTest [-Width <int>] [-HeightReset] [<CommonParameters>]

Get-ArgTest [-Height <int>] [-WidthReset] [<CommonParameters>]

Get-ArgTest -WidthReset -HeightReset [<CommonParameters>]

结果:

  • 如果 -WidthReset-HeightReset 都存在,则明确隐含参数集 D

  • 如果或者-WidthReset或者-HeightReset存在,参数集CB 是明确暗示的。


至于你试过的

对于您的原始函数定义,以下调用是不明确的:

Get-ArgTest                      -WidthReset
Get-ArgTest                                  -HeightReset

因为前者匹配两个参数集CD,
后者 BD,
其中 none 是 默认 参数集(将充当 tie-breaker)。