2010-07-20 40 views
8

Tôi có một hàm chấp nhận giá trị enum làm tham số. Như một ví dụ, hãy xem xét cái gì đó như:Chuyển các giá trị enum vào một hàm trong PowerShell

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

Bây giờ, nếu tôi gọi nó như thế này, mọi thứ đều tốt:

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

Nhưng nếu tôi gọi hàm truyền trực tiếp các giá trị enum, tôi nhận được một lỗi khá khó hiểu:

(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 

Sự khác nhau giữa khởi tạo biến với giá trị enum và chuyển giá trị enum trực tiếp là gì?

Trả lời

8

Vâng, đó là một thông báo lỗi khá khó hiểu. Tôi nghĩ rằng bạn sẽ hiểu rõ hơn với một ví dụ:

Get-ChildItem -Path C:\ 

Chú ý không có dấu ngoặc kép quanh C:\ bởi vì, một, nó implcitly được chuyển đổi sang một chuỗi, và hai, nó không phải là cần thiết để kèm theo một con đường mà không làm chứa dấu cách khi bạn chuyển đường dẫn làm tham số cho một số callee.

Vì vậy, cho phép quay trở lại chức năng của bạn, và thay đổi nó một chút:

function IsItFriday($dayOfWeek) 
{ 
    $dayOfWeek.GetType() 

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

IsItFriday [System.DayOkWeek]::Monday 

... và đầu ra:

IsPublic IsSerial Name          BaseType                       
-------- -------- ----          --------                       
True  True  String         System.Object                     
no 

Xem những gì xảy ra ở đó? PowerShell nghĩ rằng bạn đang đi trong một chuỗi thay vì một giá trị liệt kê, vì vậy đó là lý do tại sao bạn nhận được Cannot convert value "[System.DayOfWeek]::Monday" bởi vì đó là chuỗi thông thường được thông qua trong

11

Đó là một chút bất ngờ - bạn cần phải quấn nó trong ngoặc đơn để các giá trị được đánh giá:

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

cũng có thể vượt qua chỉ chuỗi như thế này:

> IsItFriday Monday 
no 
> IsItFriday Friday 
yes 

PowerShell sẽ chuyển nó thành kiểu enum. Handy, phải không :)

+0

tôi biết về việc chuyển đổi loại ngầm, tiện dụng thực sự :) Những gì tôi không hiểu, dù sao, là lý do tại sao có sự khác biệt này trong hai trường hợp ... –

+3

Lý do là trong 'IsItFriday [System.DayOfWeek] :: Monday' nó được phân tích cú pháp giống như một chuỗi. Lời giải thích đầy đủ có thể được tìm thấy trong PowerShell in Action bởi Bruce Payette. Nó giống như 'get-host get-date' so với' write-host (get-date) '. – stej

6

Để tránh lỗi này đặt giá trị enum trong ngoặc đơn:.

PS> IsItFriday ([System.DayOfWeek] :: Thứ Hai)
không

PS> IsItFriday ([System.DayOfWeek] :: Thứ Sáu)

3

Thậm chí handier là chuỗi sẽ được chuyển đổi sang ENU m giá trị nếu hợp lệ:

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

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

Điều đáng biết - tôi chưa bao giờ đoán được nó từ bài đăng gốc! –

+0

Câu trả lời hay! Trong khi @GeorgeHowarth cung cấp một giải thích tốt về lý do tại sao nó không thành công (đó là về mặt kỹ thuật những gì câu hỏi được hỏi) của bạn là một bổ sung hữu ích giải thích một cách gọn gàng để làm cho nó thành công. –

Các vấn đề liên quan