Кажется, я не могу воспроизвести вашу проблему с IValidateSetValuesGenerator
, для меня это прекрасно работает в 7.0 (я не мог удержаться от соблазна сделать параметры взаимоисключающими), варианты ниже:
class Fruit : System.Management.Automation.IValidateSetValuesGenerator {
[System.String[]] GetValidValues() {
$Fruits = @('Apples', 'Pears', 'Oranges')
Return $Fruits
}
}
Function Set-FruitSupply {
[CmdletBinding()]
Param (
[Parameter(Mandatory=$False, ParameterSetName='City')]
[ValidateSet([Fruit])]
[String]$City,
[Parameter(Mandatory=$False, ParameterSetName='County')]
[ValidateSet([Fruit])]
[String]$County,
[Parameter(Mandatory=$False, ParameterSetName='State')]
[ValidateSet([Fruit])]
[String]$State
)
Begin {}
Process {
Switch ($PSCmdlet.ParameterSetName) {
'City' { Write-Output -InputObject "The city has $City" }
'County' { Write-Output -InputObject "The county has $County" }
'State' { Write-Output -InputObject "The state has $State" }
}
}
End {}
}
Но если вы не можете заставить его работать (или вам нужна альтернатива, совместимая с 5.1), вот два варианта:
Вариант 1: Использовать пользовательский enum
enum Fruit {
Apples
Bananas
Pears
}
function Set-FruitSupply
{
[CmdletBinding()]
param(
[Parameter(Mandatory=$False, ParameterSetName='City')]
[Fruit]$City,
[Parameter(Mandatory=$False, ParameterSetName='County')]
[Fruit]$County,
[Parameter(Mandatory=$False, ParameterSetName='State')]
[Fruit]$State
)
# ...
}
В этом примере мы избежали дублирования списка, сравнивая с определенным типом перечисления Fruit
вместо
Вариант 2: используйте отдельный позиционный параметр для проверенных значений
function Set-FruitSupply
{
[CmdletBinding()]
param(
[Parameter(Mandatory=$False, ParameterSetName='City')]
[switch]$City,
[Parameter(Mandatory=$False, ParameterSetName='County')]
[switch]$County,
[Parameter(Mandatory=$False, ParameterSetName='State')]
[switch]$State,
[Parameter(Mandatory=$true, Position = 0, DontShow = $true)]
[ValidateSet('Apples','Pears','Oranges')]
[string]$Fruit
)
# use `$Fruit` in here regardless of paramset
}
В этом случае сам -Fruit
не будет автозаполняться благодаря флагу DontShow
, но его значения будут, учитывая, что другого позиционного параметра не существует, что позволяет завершать и передавать значения с одинаковым синтаксисом : ie. Set-FruitSupply -City Apples
.
Приятно то, что он работает и с версией, более старой, чем PowerShell 5