У меня есть функция, принимающая перечисление значений как параметр. Как пример, рассмотрите что-то как:
(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
Каково различие между инициализацией переменной с перечислением значений и передачей перечисления значений непосредственно?
Да, это довольно запутанное сообщение об ошибке. Я думаю, вы лучше поймете его на примере:
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"
, потому что это буквальная строка, которая передается.
Это немного неожиданно - вам нужно обернуть его в круглые скобки, чтобы значение было оценено:
> IsItFriday ([System.DayOfWeek]::Monday)
также можно передавать только строки, как это:
> IsItFriday Monday
no
> IsItFriday Friday
yes
PowerShell преобразует его в тип enum. Удобно, не правда ли :)
Чтобы избежать ошибки, заключите значение перечисления в скобки:
PS> IsItFriday ([System.DayOfWeek] :: Monday)
нет
PS> IsItFriday ([System.DayOfWeek] :: Friday)
да
Еще удобнее то, что строки будут преобразованы в значения перечисления, если они действительны:
function IsItFriday([System.DayOfWeek] $dayOfWeek) {
if($dayOfWeek -eq [System.DayOfWeek]::Friday) {
"yes"
} else {
"no"
}
}
PS 7> IsItFriday Monday
no
PS 8> IsItFriday Friday
yes