Подтвердить что ты не робот

Перечислить параметр переключателя в PowerShell

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

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

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

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

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

4b9b3361

Ответ 1

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

От: 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.

Ответ 2

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

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

Обновление: Здесь, как использовать перечисление:

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 *

Ответ 3

Вы можете использовать атрибут 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