2010-07-20 9 views
8

Tengo una función que acepta un valor enum como parámetro. Como ejemplo, considere algo como:Pasando valores enum a una función en PowerShell

(PS) > function IsItFriday([System.DayOfWeek] $dayOfWeek) { 
    if($dayOfWeek -eq [System.DayOfWeek]::Friday) { 
     "yes" 
    } else { 
     "no" 
    } 
} 

Ahora, si invoco como este, todo está bien:

(PS) > $m = [System.DayOfWeek]::Monday 
(PS) > IsItFriday $m 
no 

Pero si llamo a la función que pasa directamente el valor de enumeración, me sale una de error en lugar críptica:

(PS) > IsItFriday [System.DayOfWeek]::Monday 
IsItFriday : Cannot convert value "[System.DayOfWeek]::Monday" to type "System.DayOfWeek" 
due to invalid enumeration values. Specify one of the following enumeration values and 
try again. The possible enumeration values are "Sunday, Monday, Tuesday, Wednesday, 
Thursday, Friday, Saturday". 
At line:1 char:11 
+ IsItFriday <<<< [System.DayOfWeek]::Monday 

¿Cuál es la diferencia entre la inicialización de una variable con el valor de enumeración y pasar el valor de enumeración directamente?

Respuesta

8

Sí, ese es un mensaje de error bastante confuso. Creo que lo entendería mejor con un ejemplo:

Get-ChildItem -Path C:\ 

Aviso no hay comillas C:\ porque, uno, implcitly se convierte en una cadena, y dos, no es necesario adjuntar un camino que no lo hace Contiene espacios cuando pasas la ruta como un parámetro para un destinatario.

Así que vamos a volver a su función, y cambiar ligeramente:

function IsItFriday($dayOfWeek) 
{ 
    $dayOfWeek.GetType() 

    if ($dayOfWeek -eq [System.DayOfWeek]::Friday) 
    { 
     "yes" 
    } 
    else 
    { 
     "no" 
    } 
} 

IsItFriday [System.DayOkWeek]::Monday 

... y la salida:

IsPublic IsSerial Name          BaseType                       
-------- -------- ----          --------                       
True  True  String         System.Object                     
no 

ver lo que sucedió allí? PowerShell piensa que está de paso en una cadena en lugar de un valor de enumeración, así que por eso se obtiene Cannot convert value "[System.DayOfWeek]::Monday" porque esa es la cadena literal que se pasa en

11

Es un poco inesperada - que necesita para envolverlo entre paréntesis para que se evalúa el valor:

> IsItFriday ([System.DayOfWeek]::Monday) 

También es posible pasar sólo cadenas como esta:

> IsItFriday Monday 
no 
> IsItFriday Friday 
yes 

PowerShell lo convertirá en el tipo enum. Práctico, ¿no es así?

+0

que sabía acerca de la conversión implícita, de hecho a mano :) Lo que no entiendo, de todos modos, es por qué existe esta diferencia en los dos casos ... La razón es –

+3

que en 'IsItFriday [System.DayOfWeek] :: Monday' se analiza como una cadena. La explicación completa se puede encontrar en PowerShell in Action de Bruce Payette. Es lo mismo que 'write-host get-date' vs.' write-host (get-date) '. – stej

6

Para evitar el error de poner el valor de enumeración entre paréntesis:.

PS> IsItFriday ([System.DayOfWeek] :: lunes)
sin

PS> IsItFriday ([System.DayOfWeek] :: Viernes)

3

Incluso más práctico es que las cadenas se consiguen convertidos a enu m valores si es válido:

function IsItFriday([System.DayOfWeek] $dayOfWeek) { 
    if($dayOfWeek -eq [System.DayOfWeek]::Friday) { 
     "yes" 
    } else { 
     "no" 
    } 
} 

PS 7> IsItFriday Monday 
no 
PS 8> IsItFriday Friday 
yes 
+0

Eso vale la pena saber, ¡nunca lo habría adivinado de la publicación original! –

+0

¡Buena respuesta! Mientras que @GeorgeHowarth proporciona una buena explicación de por qué falla (que técnicamente es la pregunta), el suyo es un complemento útil que explica una forma concisa de hacerlo exitoso. –

Cuestiones relacionadas