Передающее перечисление оценивает функции в PowerShell

У меня есть функция, принимающая перечисление значений как параметр. Как пример, рассмотрите что-то как:

(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

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

11
задан Paolo Tedesco 20 July 2010 в 11:49
поделиться

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", потому что это буквальная строка, которая передается.

9
ответ дан 3 December 2019 в 02:19
поделиться

Это немного неожиданно - вам нужно обернуть его в круглые скобки, чтобы значение было оценено:

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

также можно передавать только строки, как это:

> IsItFriday Monday
no
> IsItFriday Friday
yes

PowerShell преобразует его в тип enum. Удобно, не правда ли :)

13
ответ дан 3 December 2019 в 02:19
поделиться

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

PS> IsItFriday ([System.DayOfWeek] :: Monday)
нет

PS> IsItFriday ([System.DayOfWeek] :: Friday)
да

8
ответ дан 3 December 2019 в 02:19
поделиться

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

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

PS 7> IsItFriday Monday
no
PS 8> IsItFriday Friday
yes
3
ответ дан 3 December 2019 в 02:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: