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
存在,参数集C
或 B
是明确暗示的。
至于你试过的:
对于您的原始函数定义,以下调用是不明确的:
Get-ArgTest -WidthReset
Get-ArgTest -HeightReset
因为前者匹配两个参数集C
和D
,
后者 B
和 D
,
其中 none 是 默认 参数集(将充当 tie-breaker)。
我一直在尝试让多组互斥起作用。 我希望“宽度”与“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
存在,参数集C
或B
是明确暗示的。
至于你试过的:
对于您的原始函数定义,以下调用是不明确的:
Get-ArgTest -WidthReset
Get-ArgTest -HeightReset
因为前者匹配两个参数集C
和D
,
后者 B
和 D
,
其中 none 是 默认 参数集(将充当 tie-breaker)。