我有一个接受枚举值作为参数的函数。例如,考虑以下内容:
(PS) > function IsItFriday([System.DayOfWeek] $dayOfWeek) {
if($dayOfWeek -eq [System.DayOfWeek]::Friday) {
"yes"
} else {
"no"
}
}
现在,如果我像这样调用它,一切都很好:
(PS) > $m = [System.DayOfWeek]::Monday
(PS) > IsItFriday $m
no
但是如果我调用函数直接传递枚举值,我会得到一个相当神秘的错误:
(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
将变量初始化为枚举值并直接传递枚举值有什么区别?
答案 0 :(得分:11)
这有点出乎意料 - 您需要将其包装在括号中,以便评估该值:
> IsItFriday ([System.DayOfWeek]::Monday)
也可以只传递这样的字符串:
> IsItFriday Monday
no
> IsItFriday Friday
yes
PowerShell会将其转换为枚举类型。方便,不是吗:)。
答案 1 :(得分:8)
是的,这是一个相当令人困惑的错误消息。我想你会更好地理解一个例子:
Get-ChildItem -Path C:\
请注意,C:\
周围没有引号,因为,一,它实际上转换为字符串,而且当你将路径作为参数传递时,没有必要包含一个不包含空格的路径对某些被叫者。
让我们回到你的功能,然后稍微改变一下:
function IsItFriday($dayOfWeek)
{
$dayOfWeek.GetType()
if ($dayOfWeek -eq [System.DayOfWeek]::Friday)
{
"yes"
}
else
{
"no"
}
}
IsItFriday [System.DayOkWeek]::Monday
...和输出:
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
no
看看那里发生了什么? PowerShell认为你传入一个字符串而不是一个枚举值,这就是你得到Cannot convert value "[System.DayOfWeek]::Monday"
的原因,因为那是传入的文字字符串。
答案 2 :(得分:7)
为避免错误,将枚举值放在括号中:
PS&gt; IsItFriday([System.DayOfWeek] ::星期一)
无
PS&gt; IsItFriday([System.DayOfWeek] ::星期五)
是
答案 3 :(得分:3)
更有用的是,如果有效,字符串将转换为枚举值:
function IsItFriday([System.DayOfWeek] $dayOfWeek) {
if($dayOfWeek -eq [System.DayOfWeek]::Friday) {
"yes"
} else {
"no"
}
}
PS 7> IsItFriday Monday
no
PS 8> IsItFriday Friday
yes