Передача значений перечисления функции в PowerShell

у меня есть функция, принимающая значение типа enum в качестве параметра. В качестве примера рассмотрим что-то вроде:

(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

в чем разница между инициализацией переменной со значением перечисления и передачей значения перечисления напрямую?

4 ответов


Да, это довольно запутанное сообщение об ошибке. Я думаю, вы бы лучше поняли на примере:

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 преобразует его в тип перечисления. Удобно, не так ли :)


чтобы избежать ошибки, поставьте значение перечисления в скобки:

PS > IsItFriday ([система.DayOfWeek]:: Понедельник)
нет!--1-->

PS > IsItFriday ([система.DayOfWeek]:: Пятница)
да


еще удобнее, что строки будут преобразованы в значения перечисления, если они действительны:

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

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