Повторяющийся массив для ValidateSet - PullRequest
0 голосов
/ 07 апреля 2020

Учитывая этот базовый c скелет функции:

Function Set-FruitSupply {
  [CmdletBinding()]
  Param (
    [Parameter(Mandatory=$False)][ValidateSet('Apples','Pears','Oranges')][String]$City,
    [Parameter(Mandatory=$False)][ValidateSet('Apples','Pears','Oranges')][String]$County,
    [Parameter(Mandatory=$False)][ValidateSet('Apples','Pears','Oranges')][String]$State
  )
  Begin {}
  Process {
    Switch ($PSBoundParameters.Keys) {
      'City'   { Write-Output -InputObject "The city has $City"   }
      'County' { Write-Output -InputObject "The city has $County" }
      'State'  { Write-Output -InputObject "The city has $State"  }
    }
  }
  End {}
}

Мне не нравится идея повторения, поэтому я хотел бы заменить эти 3 набора ValidateSets заполнителем, поэтому я только Я должен набрать яблоки, груши и апельсины один раз. Насколько мне известно, переменная не работает.

Поскольку я использую Pw Sh 7, я попытался создать класс.

class Fruit : System.Management.Automation.IValidateSetValuesGenerator {
  [System.String[]] GetValidValues() {
    $Fruits = @('Apples', 'Pears', 'Oranges')
    Return $Fruits
  }
}

Поместив это над функцией в вопрос и использование ValidateSet([Fruit]). Это не похоже на работу. Я подумал, что это должно работать со статическими c данными, а также с динамическими c данными, возможно, я просто делаю что-то не так.

Кто-нибудь знает правильный способ сделать это, поэтому мне нужно только написать мой набор один раз?

1 Ответ

2 голосов
/ 07 апреля 2020

Кажется, я не могу воспроизвести вашу проблему с 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...