Главная > Powershell > Зачем нужны наборы параметров в Powershell

Зачем нужны наборы параметров в Powershell

При помощи наборов параметров в Powershell можно делать довольно интересные вещи при объявлении параметров.

Суть наборов параметров заключается в том, что (как, наверное, понятно из названия) параметры можно организовать в наборы. Это делается при помощи ключевого слова ParameterSetName при объявлении параметра,  за которым следует имя набора. А вот зачем это нужно – пару ситуаций сегодня рассмотрим.

Взаимоисключающие параметры

Во-первых, параметры можно сделать взаимоисключающими. Т.е. можно использовать один параметр, или другой, но не оба одновременно.

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

Рассмотрим на примере:

function Test-ParameterSet
{
    [CmdletBinding(DefaultParameterSetName='number')]
    param
    (
        [int]
        [Parameter(ParameterSetName='number')]
        $Id,

        [string]
        [Parameter(ParameterSetName='text')]
        $Name
    )

    $PSCmdlet.ParameterSetName
    $PSBoundParameters
} 

Функция Test-ParameterSet имеет два параметра: Id и Name. Они принадлежат разным наборам параметров (number и text соответственно). При вызове функции можно указать либо первый параметр, либо второй, но не оба одновременно. В зависимости от выбранного параметра используется набор параметров либо number, либо name. Собственно это видно в выводе функции: функция выводит имя используемого набора параметров ($PSCmdlet.ParameterSetName), сам параметр и его значение ($PSBoundParameters).

На всякий случай напомню:

$PSBoundParameters содержит словарь активных параметров и их текущих значений. Значение этой переменной действительно только в области объявления параметров, включая скрипт или функцию. Можно использовать эту переменную для отображения или изменения текущих значений параметров или для передачи значений параметров другому скрипту или функции.

Как сделать параметр обязательным и необязательным одновременно

 

Более того, один и тот же параметр, в зависимости от ситуации, может быть как обязательным, так и необязательным.

Для того, чтобы сделать параметр обязательным и необязательным одновременно в пределах функции, или скрипта, его нужно привязать к разным наборам параметров. В этом случае, в зависимости от используемого в конкретной ситуации набора параметров, этот параметр будет либо обязательным, либо нет.

Рассмотрим пример:

function Test-ParameterSet
{
    [CmdletBinding(DefaultParameterSetName='NonCredential')]
    param
    (
        $Id,

        [Parameter(ParameterSetName='LocalOnly', Mandatory=$false)]
        $LocalAction,

        [Parameter(ParameterSetName='Credential', Mandatory=$true)]
        [Parameter(ParameterSetName='NonCredential', Mandatory=$false)]
        $ComputerName,

        [Parameter(ParameterSetName='Credential', Mandatory=$false)]
        $Credential
    )

    $PSCmdlet.ParameterSetName
    $PSBoundParameters
}

В этом примере функция Test-ParameterSet имеет четыре параметра:

  • Параметр Id не привязан ни к какому набору параметров, и может использоваться с любым из параметров.
  • Параметр LoaclAction привязан к набору параметров LocalOnly, и, следовательно, его одновременно можно использовать только с параметром Id.
  • Параметр Credential привязан к набору параметров Credential, следовательно, вместе с ним можно использовать только параметры из набора Credential.
  • Параметр ComputerName – самый интересный здесь параметр. Он привязан к двум наборам параметров, в одном из которых он обязателен ([Parameter(ParameterSetName=’Credential’, Mandatory=$true)]), а в другом – необязателен ([Parameter(ParameterSetName=’NonCredential’, Mandatory=$false)]). Это значит, что параметр ComputerName можно использовать как единственный параметр, (или вместе с параметром Id). С параметром LoaclAction его использовать нельзя (так как они принадлежат разным наборам параметров), а при использовании параметра Credential параметр ComputerName является обязательным.

Если при разработке скрипта задача стоит так, что задание одного параметра становится доступным только при указании другого (например, Credential можно использовать только при указании ComputerName), то в этом случае нужно использовать динамические параметры.

Реклама
Рубрики:Powershell Метки:
  1. 30/07/2015 в 09:23

    Спасибо за стратейку. Помогло.

  1. No trackbacks yet.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: