2010-09-17 9 views
43

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

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

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

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

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

ответ

75

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

+0

Этот подход заставляет вас использовать расширенные функции, которые не всегда желательны. Вы также не получаете какой-либо формы автозаполнения по значениям перечисления. OTOH вам не нужно ставить оценку перечисления в пределах parens, например. '[MyEnum] :: A'. Итак, смешанная сумка, я думаю. :-) –

+0

Thanks Keith. С другой стороны, функция должна реализовать различные проверки параметров, чтобы определить, было ли указано более одного параметра коммутатора. BTW, не все мы используем PowerShell v2 :) –

+0

Keith, вы получаете расширение вкладок на ValidateSet, если используете PowerTab ... просто sayin. ;) – JasonMArcher

7

Этот blog post by the PowerShell team определяет, как это сделать в PowerShell 1.0. В PowerShell 2.0 вы можете использовать Add-Type, как так:

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

Update: Вот как использовать перечисление:

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

Вам нужны круглые скобки вокруг аргумента для разбора аргумента в виде Тип. Это необходимо, потому что аргументы обрабатываются более или менее как строки. Зная это, вы можете также передать их перечисление в простой форме строки и 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 *

+0

Но как я могу использовать эти примеры для перечисления командной строки "PARAM" целей? – bits

+0

интересный пример, но я думаю, что это не очень полезно в этом случае. –

+1

Да, нужно использовать укусы парсеров. OTOH Мне нравится вкладка-завершение - следующая лучшая вещь для истинной статической проверки значения перечисления. ValidateSet - это, безусловно, хорошая функция на языке, просто слишком плохо PowerShell не использует эту информацию для запуска табуляции.BTW, если бы это был всего лишь один набор вариантов, вы могли бы использовать коммутаторы, подобные используемым OP, - просто поместите каждый переключатель в отдельный набор параметров и выберите один из них по умолчанию (если они не указаны). –

7

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