Enum как параметр переключателя в PowerShell - PullRequest
53 голосов
/ 17 сентября 2010

Я использую параметры переключателя в своем скрипте PowerShell таким способом.

param(
    [switch] $Word,
    [switch] $Excel,
    [switch] $powerpoint,
    [switch] $v2007,
    [switch] $v2010,
    [switch] $x86,
    [switch] $x64,
)

Я пытаюсь найти какой-нибудь изящный способ придать ему более enum стиль.Как можно догадаться, я бы хотел, чтобы пользователь выбирал между word, excel и powerpoint.И между x2007 и v2010.

Есть ли удобный способ получить стиль перечисления входных параметров?

Я новичок в PowerShell.Поэтому, если это звучит так, что я не знаю чего-то очевидного, то, пожалуйста, укажите мне ссылку, по которой я могу прочитать об этом.

Ответы [ 3 ]

92 голосов
/ 18 сентября 2010

Я бы вместо этого использовал атрибут параметра ValidateSet.

From: about_Functions_Advanced_Parameters

Атрибут ValidateSet указывает набор допустимых значений для параметра или переменной.Windows PowerShell создает ошибку, если значение параметра или переменной не соответствует значению в наборе.

Пример функции:

function test-value
{
    param(
        [Parameter(Position=0)]
        [ValidateSet('word','excel','powerpoint')]
        [System.String]$Application,

        [Parameter(Position=1)]
        [ValidateSet('v2007','v2010')]
        [System.String]$Version
    )


    write-host "Application: $Application"
    write-host "Version: $Version"
}   


PS > test-value -application foo

Вывод:

test-value : Cannot validate argument on parameter 'Application'. The argument "foo" does not belong to the set "word,excel,powerpoint" specified by the ValidateSet attribute. Supply an argument that is in the set and then try the command again.

11 голосов
/ 18 сентября 2010

Вы можете использовать атрибут ValidateSet:

function My-Func
{
    param (
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [ValidateSet('Word', 'Excel', 'PowerPoint', 'v2007', 'v2010', 'x86', 'x64')]
        [String]$MyParam
    )

    Write-Host "Performing action for $MyParam"
}

My-Func -MyParam 'Word'
My-Func -MyParam 'v2007'
My-Func -MyParam 'SomeVal'

Выход:

Performing action for Word
Performing action for v2007
My-Func : Cannot validate argument on parameter 'MyParam'. The argument "SomeVal" does not belong to the set "Word,Excel,PowerPoint,v2007,v2010,x86,x64" specified by the ValidateSet attribute. Supply an argument that is in the
 set and then try the command again.
At C:\Users\George\Documents\PowerShell V2\ValidateSetTest.ps1:15 char:17
+ My-Func -MyParam <<<<  'SomeVal'
    + CategoryInfo          : InvalidData: (:) [My-Func], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,My-Func
10 голосов
/ 17 сентября 2010

Это сообщение в блоге команды PowerShell определяет, как это сделать в PowerShell 1.0. В PowerShell 2.0 вы можете использовать Add-Type следующим образом:

C:\PS> Add-Type -TypeDefinition @'
>> public enum MyEnum {
>> A,
>> B,
>> C,
>> D
>> }
>> '@
>>

Обновление: Вот как использовать enum:

C:\PS> function foo([MyEnum]$enum) { $enum }
C:\PS> foo ([MyEnum]::A)
A

Вам нужны круглые скобки вокруг аргумента, чтобы проанализировать аргумент как тип. Это необходимо, потому что аргументы обрабатываются более или менее как строки. Зная это, вы также можете передать им enum в простой строковой форме, и PowerShell выяснит это:

C:\PS> foo A
A
C:\PS> $arg = "B"
C:\PS> foo $arg
B
C:\PS> foo F
error*

ошибка - F не является одним из перечисленных значений - допустимые значения включают A, B, C, D *

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