68 votes

Enum comme paramètre de commutateur dans Powershell

Je suis en utilisant les paramètres de commutateur dans mon script Powershell dans ce mode.

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

J'essaie de trouver une façon ingénieuse pour avoir plus d'enum style. Comme on peut le deviner, j'ai envie à l'utilisateur de choisir entre word, excel et powerpoint. Et entre x2007 et v2010.

Est-il une manière simple d'obtenir l'entrée params enum style?

Je suis nouveau sur le powershell. Donc, si cela sonne comme ça, je ne sais pas quelque chose d'évident, alors s'il vous plaît m'indiquer un lien où je peux lire à ce sujet.

Merci pour l'aide.

118voto

Shay Levy Points 41404

Je voudrais utiliser un ValidateSet attribut de paramètre à la place.

De: about_Functions_Advanced_Parameters

"La ValidateSet attribut secifies un ensemble de valeurs valides pour l'argument du paramètre. Windows PowerShell exécution génère une erreur si le paramètre argument ne correspond pas à une valeur dans le jeu."

Exemple la fonction de:

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-valeur : Impossible de valider l'argument sur le paramètre "Application". L'argument "foo" n'appartient pas à l'ensemble "word,exce,powerpoint" spécifié par le ValidateSet attribut. Fournir un argument qui est dans le jeu, puis essayez de nouveau la commande.

12voto

George Howarth Points 1364

Vous pouvez utiliser l'attribut 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'
 

Sortie:

 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
 

10voto

Keith Hill Points 73162

Ce post de blog par le PowerShell équipe définit comment le faire en PowerShell 1.0. Dans PowerShell 2.0, vous pouvez utiliser les Add-Type de la sorte:

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

Mise à jour: Voici comment utiliser l'enum:

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

Vous avez besoin des parenthèses autour de l'argument d'analyser l'argument comme un Type. Cela est nécessaire parce que les arguments sont traités plus ou moins comme des chaînes de caractères. Sachant cela, vous pouvez également passer enum dans un simple formulaire de chaîne et powershell figure it out:

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

erreur - F n'est pas l'une des valeurs énumérées - les valeurs valides sont A,B,C,D *

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X