2010-09-17 29 views
43

Estoy usando parámetros de conmutación en mi script de PowerShell de esta manera.Enum como parámetro del interruptor en PowerShell

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

Estoy tratando de encontrar una manera ordenada de tener más estilo de enum. Como cualquiera podría adivinar, me gustaría que el usuario elija entre palabra, excel y powerpoint. Y entre x2007 y v2010.

¿Hay alguna manera de obtener params de entrada enum style?

Soy nuevo en PowerShell. Entonces, si esto suena como que no sé algo obvio, entonces diríjanme a algún enlace donde pueda leer al respecto.

Respuesta

75

Yo usaría un atributo de parámetro ValidateSet en su lugar.

Desde: about_Functions_Advanced_Parameters

El atributo ValidateSet especifica un conjunto de valores válidos para un parámetro o variable . Windows PowerShell genera un error si un parámetro o un valor de variable no coincide con un valor en el conjunto.

función Ejemplo:

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 

Salida:

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

Este enfoque lo obliga a utilizar funciones avanzadas que no son * siempre * deseables. Tampoco obtiene ningún tipo de autocompletado en los valores enum. OTOH no tienes que poner la evaluación enum dentro de parens, p. '[MyEnum] :: A'. Entonces, una bolsa mixta, supongo. :-) –

+0

Gracias Keith. Por otro lado, la función necesita implementar varias comprobaciones de parámetros para encontrar si se especificó más de un parámetro de conmutación. Por cierto, ¿no estamos todos utilizando PowerShell v2 :) –

+0

Keith, obtienes expansión de pestañas en ValidateSet si usas PowerTab ... solo dices. ;) – JasonMArcher

7

Este blog post by the PowerShell team define cómo hacer esto en PowerShell 1.0. En PowerShell 2.0 se puede utilizar Add-Type de este modo:

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

Actualización: Aquí es cómo utilizar la enumeración:

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

Necesita los paréntesis alrededor del argumento para analizar el argumento como una Tipo. Esto es necesario porque los argumentos se tratan más o menos como cadenas. Sabiendo esto, también se puede pasarlos enumeración en una forma de cadena simple y PowerShell dará cuenta de ello:

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

error - F no es uno de los valores enumerados - Los valores válidos son A, B, C, D *

+0

Pero, ¿cómo puedo usar estos ejemplos de enumeración para los propósitos de línea de comandos "param"? – bits

+0

un ejemplo interesante, pero creo que no es realmente útil en este caso. –

+1

Sí, teniendo que usar el tipo de mordeduras de los parens. OTOH Me gusta la finalización de pestañas, la mejor alternativa para una verificación estática verdadera del valor enum. ValidateSet es ciertamente una buena característica para tener en el idioma, lástima que PowerShell no use esa información para conducir la finalización de pestañas.Por cierto, si se tratara de un solo conjunto de opciones, podría usar interruptores como los que usa el OP: simplemente coloque cada interruptor en un conjunto de parámetros por separado y elija uno para que sea el predeterminado (si no se especifica ninguno). –

7

Usted puede utilizar el atributo 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' 

salida:

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 
Cuestiones relacionadas