2010-07-20 7 views
8

में किसी फ़ंक्शन में enum मानों को पास करना मेरे पास पैरामीटर के रूप में enum मान को स्वीकार करने वाला फ़ंक्शन है। अब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 

लेकिन अगर मैं समारोह सीधे गुजर enum मूल्य कहते हैं, मैं एक मिल बल्कि छुपे त्रुटि:

(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 मूल्य सीधे गुजर के बीच क्या अंतर है?

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

भी यह संभव है इस तरह केवल तार पारित करने के लिए:

> IsItFriday Monday 
no 
> IsItFriday Friday 
yes 

PowerShell -

उत्तर

8

हां, यह एक भ्रमित त्रुटि संदेश है। मुझे लगता है कि आप एक उदाहरण के साथ बेहतर ढंग से समझने होगा:

Get-ChildItem -Path C:\ 

सूचना वहाँ C:\ आसपास कोई उद्धरण, क्योंकि एक, यह implcitly एक स्ट्रिंग में परिवर्तित हो जाता है, और दो, यह एक पथ जो नहीं है संलग्न करने के लिए आवश्यक नहीं है जब आप पथ को कुछ कैली के पैरामीटर के रूप में पास करते हैं तो रिक्त स्थान होते हैं।

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" मिलता है क्योंकि कि शाब्दिक स्ट्रिंग में पारित हो जाता है कि है

11

यह एक छोटा सा अप्रत्याशित है आप इतना है कि मूल्य का मूल्यांकन किया जाता कोष्टक में लपेट की जरूरत है इसे enum प्रकार में परिवर्तित कर देगा। हैंडी, है ना :)

+0

मैं अंतर्निहित प्रकार रूपांतरण के बारे में पता था, काम वास्तव में :) मैं क्या समझ में नहीं आता क्यों दो मामलों में इस अंतर नहीं है, वैसे भी, है ... –

+3

कारण है कि 'IsItFriday [System.DayOfWeek] :: सोमवार' में यह एक स्ट्रिंग की तरह पार्स किया गया है। ब्रूस पेएट द्वारा एक्शन में पावरशेल में पूर्ण स्पष्टीकरण पाया जा सकता है। यह 'लिखने-होस्ट मिल-डेट' बनाम 'लिखने वाला होस्ट (प्राप्त करने वाला)' जैसा ही है। – stej

6

त्रुटि कोष्टक में enum मूल्य डाल से बचने के लिए:।

पुनश्च> IsItFriday ([System.DayOfWeek] :: शुक्रवार)
कोई

पुनश्च> IsItFriday ([System.DayOfWeek] :: शुक्रवार)
हाँ

3

भी handier कि तार ENU परिवर्तित हो जाएगा मीटर मान मान्य करता है, तो:

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

यह जानने लायक है - मैंने इसे मूल पोस्ट से कभी अनुमानित नहीं किया होगा! –

+0

अच्छा जवाब! जबकि @ जॉर्ज हॉर्थ यह एक अच्छा स्पष्टीकरण प्रदान करता है कि यह क्यों विफल रहता है (जो तकनीकी रूप से सवाल पूछा गया है) आपका एक उपयोगी पूरक है जो इसे सफल बनाने के लिए एक संक्षिप्त तरीका बताता है। –