2012-10-16 12 views
8

पावरहेल अनोलिंग मुझे पागल कर रही है।ऐरेलिस्ट अनलोलिंग

मेरे पास एक एक्सचेंज प्राप्तकर्ता से ईमेल पते पुनर्प्राप्त करने के लिए निम्न कोड है। मैं ArrayList का उपयोग कर रहा हूं क्योंकि यह कई लोगों द्वारा सुझाया जाता है जब आप सरणी से वस्तुओं को हटाने की क्षमता चाहते हैं।

$aliases = New-Object System.Collections.ArrayList 
$smtpAddresses = (Get-Recipient $this.DN).EmailAddresses | ?{$_.Prefix.ToString() -eq 'smtp' } 
    foreach ($smtpAddress in $smtpAddresses) { 
     $aliases.Add($smtpAddress.SmtpAddress) 
    } 
return $aliases 

$ का मूल्य उपनाम समारोह के अंत में सही नहीं है (यानी एक्स में ईमेल पते और प्रकार ArrayList है जाएगा), लेकिन लौटने के बाद यह System.Object [] हो जाता है और 2x प्रविष्टियां हैं। एक्स इंट 32 के बाद एक्स स्ट्रिंग्स (यानी {0, 1, बॉब @ यहां, बॉब @ वहां}) हैं। ऐसा क्यों होता है और मैं अपने ऐरेलिस्ट को बरकरार रखने के लिए कैसे? क्या मैं ArrayList का उपयोग करने के लिए गलत हूँ?

जिज्ञासा से, पीएस अनोलिंग के परिणामस्वरूप सभी प्रश्न/समस्याओं के साथ, इसका उद्देश्य क्या है? शक्तिशक्ति का बड़ा लाभ यह है कि आप अपने पाठ के अनुमानों के बजाय सीधे वस्तुओं के साथ काम करते हैं, दुर्भाग्यवश, मुझे कभी नहीं पता कि मैं किस प्रकार की वस्तु के साथ काम कर रहा हूं - और यहां तक ​​कि जब भी मैं जांच करता हूं, यह अधिक आकार के लिए अपना आकार नहीं लग रहा है कोड की कुछ पंक्तियों की तुलना में।

- संपादित करें समारोह एक PSObject

$get_aliases = { ... } 
$obj | Add-Member -MemberType ScriptProperty -Name Aliases -Value $get_aliases -SecondValue $set_aliases 

उत्तर

6

समस्या का एक हिस्सा कैसे सरणी के अंदर इस्तेमाल किया जा रहा है समारोह। याद रखें, PowerShell में एक फ़ंक्शन वास्तव में वापसी कुछ भी नहीं करता है। यह पाइपलाइन के लिए वस्तुओं लिखता है। इसलिए, वापसी अनिवार्य है, लेकिन वास्तव में किसी भी समस्या का कारण नहीं है। Add फ़ंक्शन का उपयोग समस्या पैदा कर रहा है क्योंकि Addreturns वह अनुक्रमणिका जिस पर मान जोड़ा गया था और इसलिए पाइपलाइन को भी लिखता है।

function get-myarray 
{ 
    $al = New-Object System.Collections.ArrayList 
    $al.Add(0) 
    $al.Add(1) 
    $al.Add('[email protected]') 
    $al.Add('you.co.com') 
    return $al 
} 

$array = get-myarray 
$array.Count 
8  

नोट कैसे आकार 8. है क्या किया जाना चाहिए क्या Add समारोह द्वारा दिया जाता है के लेखन को दबाने के लिए है। ऐसा करने के कई तरीके हैं, लेकिन यहाँ एक है:

function get-myarray 
{ 
    $al = New-Object System.Collections.ArrayList 
    $al.Add(0) | out-null 
    $al.Add(1) | out-null 
    $al.Add('[email protected]') | out-null 
    $al.Add('you.co.com') | out-null 
    return $al 
} 

$array = get-myarray 
$array.Count 
4 

मैं `ArrayList 'का उपयोग पर विश्वास नहीं है तो आप इसे से आइटम निकालना चाहते हैं तो एक गलत एक है।

जहाँ तक unrolling चला जाता है के रूप में, यह एक पूरी अन्य प्रश्न के हकदार और already addressed किया गया है।

+0

@bob इसे सुनकर खुशी हुई। इसे अपने अन्वेषण के साथ रखें! * पाइपलाइन * मोड में काम करने में दिमाग को कम करने में थोड़ा समय लगता है। एक बार ऐसा होने पर सोचा जाता है कि आप सराहना करना शुरू कर देंगे कि PowerShell आपके लिए क्या कर रहा है। –

0

के हिस्से के रूप में कहा जाता है आप कैसे $aliases वापसी कर रहे हैं?

इस तरह?

$a = MyFunctionName # In this way `$a` is of type [OBJECT[]] 

आप इस तरह की कोशिश कर सकते हैं: के बाद आप इस तरह से प्रकार पता कर सकते हैं

[System.Collections.ArrayList]$a = MyFunctionName 

:

$a.item(0).gettype() 
संबंधित मुद्दे