Дополнительные, но взаимоисключающие переключатели в функции - PullRequest
0 голосов
/ 29 мая 2019

Я хочу написать функцию в пользовательском модуле powershell, который может определять некоторые переключатели.

Функция должна вызываться либо без переключателя, либо с одним переключателем.Несколько переключателей не допускаются.

Пример:

Get-Foo -Value "text"                          # Should return "text"
Get-Foo -Value "2019-01-01T00:00:00Z" -AsDate  # Should return the value as date
Get-Foo -Value "42" -AsInteger                 # Should return 42 as integer
Get-Foo -Value "xxx" -AsDate -AsInteger        # Should fail

Для поддержки этих случаев я играю с наборами параметров:

function Get-Foo{
    param(
        [Parameter(Mandatory=$true)]
        [string]$Value,
        [Parameter(ParameterSetName='AsDate')]
        [Switch]$AsDate,
        [Parameter(ParameterSetName='AsInteger')]
        [Switch]$AsInteger

    )

    switch ($PsCmdlet.ParameterSetName) {
        "AsDate" {
            [datetime]::Parse($Value)
        }
        "AsInteger" {
            [int]::Parse($Value)
        }
        "__AllParameterSets" { 
            $Value
        }
    }
}

Однако этоне работает, как ожидалось.Проход одного из двух выключателей работает.Передача двух переключателей завершается неудачно (но это предусмотрено).

PОтключение переключателя вообще не удается, поскольку он не может разрешить набор параметров.

Как это исправить?

1 Ответ

2 голосов
/ 29 мая 2019

Если вы зададите для функции DefaultParameterSetName и измените последний тест переключения на Default, все должно работать:

function Get-Foo {
    [CmdletBinding(DefaultParameterSetName = 'None')]
    param(
        [Parameter(Mandatory=$true)]
        [string]$Value,
        [Parameter(ParameterSetName='AsDate')]
        [Switch]$AsDate,
        [Parameter(ParameterSetName='AsInteger')]
        [Switch]$AsInteger

    )

    switch ($PsCmdlet.ParameterSetName) {
        "AsDate" {
            [datetime]::Parse($Value)
        }
        "AsInteger" {
            [int]::Parse($Value)
        }
        default { 
            $Value
        }
    }
}

Результат:

Get-Foo -Value "text"                          # Returns "text"
Get-Foo -Value "2019-01-01T00:00:00Z" -AsDate  # Returns the value as date (if Parse() is possible)
Get-Foo -Value "42" -AsInteger                 # Returns 42 as integer (if Parse() is possible)
Get-Foo -Value "xxx" -AsDate -AsInteger        # Fails

Примечание: для более сложных сравнений Switch () рассмотрите оператор break, чтобы остановить сравнение коммутатора после совпадения. См. about_Switch

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