Передача значений перечисления в функцию в PowerShell - PullRequest
9 голосов
/ 20 июля 2010

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

(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

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

Ответы [ 4 ]

12 голосов
/ 20 июля 2010

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

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

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

> IsItFriday Monday
no
> IsItFriday Friday
yes

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

9 голосов
/ 20 июля 2010

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

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

7 голосов
/ 21 июля 2010

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

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

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

3 голосов
/ 23 июля 2010

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

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

PS 7> IsItFriday Monday
no
PS 8> IsItFriday Friday
yes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...