Наборы взаимоисключающих параметров в PowerShell: почему это неоднозначно?
Я пытался заставить работать несколько наборов взаимных исключений. Я хочу, чтобы «Ширина» взаимоисключала «WidthReset», а «Высота» была взаимоисключающей с «HeightReset».
Справка по командлету показывает:
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