Passing enum values to a function in PowerShell
I have a function accepting an enum value as parameter. As an example, consider something like:
(PS) > function IsItFriday([System.DayOfWeek] $dayOfWeek) {
if($dayOfWeek -eq [System.DayOfWeek]::Friday) {
"yes"
} else {
"no"
}
}
Now, if I invoke it like this, everything is fine:
(PS) > $m = [System.DayOfWeek]::Monday
(PS) > IsItFriday $m
no
But if I call the function passing directly the enum value, I get a rather cryptic error:
(P开发者_运维百科S) > 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
What's the difference between initializing a variable with the enum value and passing the enum value directly?
It's a little bit unexpected - you need to wrap it in parenthesis so that the value is evaluated:
> IsItFriday ([System.DayOfWeek]::Monday)
also it is possible to pass only strings like this:
> IsItFriday Monday
no
> IsItFriday Friday
yes
PowerShell will convert it to the enum type. Handy, isn't it :)
To avoid the error put the enum value in parenthesis:
PS > IsItFriday ([System.DayOfWeek]::Monday)
no
PS > IsItFriday ([System.DayOfWeek]::Friday)
yes
Yes, that is a rather confusing error message. I think you would understand better with an example:
Get-ChildItem -Path C:\
Notice there are no quotes around C:\
because, one, it implcitly gets converted to a string, and two, it is not necessary to enclose a path which does not contain spaces when you pass the path as a parameter to some callee.
So lets go back to your function, and change it slightly:
function IsItFriday($dayOfWeek)
{
$dayOfWeek.GetType()
if ($dayOfWeek -eq [System.DayOfWeek]::Friday)
{
"yes"
}
else
{
"no"
}
}
IsItFriday [System.DayOkWeek]::Monday
...and the output:
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
no
See what happened there? PowerShell thinks you are passing in a string instead of an enumeration value, so that's why you get Cannot convert value "[System.DayOfWeek]::Monday"
because that is the literal string that gets passed in.
Even handier is that strings will get converted to enum values if valid:
function IsItFriday([System.DayOfWeek] $dayOfWeek) {
if($dayOfWeek -eq [System.DayOfWeek]::Friday) {
"yes"
} else {
"no"
}
}
PS 7> IsItFriday Monday
no
PS 8> IsItFriday Friday
yes
精彩评论