# array
C:\> (1,2,3).count
3
C:\> (1,2,3 | measure).count
3
# hashtable
C:\> @{1=1; 2=2; 3=3}.count
3
C:\> (@{1=1; 2=2; 3=3} | measure).count
1
# array returned from function
C:\> function UnrollMe { $args }
C:\> (UnrollMe a,b,c).count
3
C:\> (UnrollMe a,b,c | measure).count
1
C:\> (1,2,3).gettype() -eq (UnrollMe a,b,c).gettype()
True
हैशटेबल्स के साथ विसंगति fairly well known है, हालांकि official documentation केवल इसे विशिष्ट रूप से उल्लेख करता है (उदाहरण के माध्यम से)।क्या निर्धारित करता है कि पावरहेल पाइपलाइन संग्रह को अनलॉक कर देगी या नहीं?
हालांकि, कार्यों के साथ समस्या मेरे लिए खबर है। मैं बहुत शर्मिंदा हूं, इससे पहले कि उसने मुझे पहले काट नहीं दिया है। क्या कोई मार्गदर्शक सिद्धांत है जिसे हम अनुयायियों का पालन कर सकते हैं? मुझे पता है कि सी # में cmdlets लिखते समय overload of WriteObject है जहां आप स्पष्ट रूप से गणना को नियंत्रित कर सकते हैं, लेकिन AFAIK पॉश भाषा में ऐसा कोई भी निर्माण नहीं है। जैसा कि अंतिम उदाहरण दिखाता है, पोश दुभाषिया का मानना है कि पाइप किए जाने वाले वस्तुओं के प्रकार में कोई अंतर नहीं है। मुझे संदेह है कि हुड के नीचे कुछ ऑब्जेक्ट बनाम पीएसओब्जेक्ट अजीबता हो सकती है, लेकिन जब आप शुद्ध पोश लिख रहे हैं और स्क्रिप्ट भाषा को "बस काम" करने की उम्मीद है तो इसका बहुत कम उपयोग होता है।
/संपादित करें/
कीथ का कहना है कि मेरे उदाहरण में, मैं एक एकल स्ट्रिंग [] तर्क में नहीं बल्कि 3 स्ट्रिंग तर्क से गुजर रहा हूँ सही है। दूसरे शब्दों में, कारण मापन-ऑब्जेक्ट का कारण है कि गणना = 1 है क्योंकि यह एक सरणी-ऑफ-एरे देख रहा है जिसका पहला तत्व @ ("ए", "बी", "सी") है। काफी उचित। यह ज्ञान आप कई तरीकों से समस्या के समाधान के लिए अनुमति देता है:
# stick to single objects
C:\> (UnrollMe a b c | measure).count
3
# rewrite the function to handle nesting
C:\> function UnrollMe2 { $args[0] }
C:\> (UnrollMe2 a,b,c | measure).count
3
# ditto
C:\> function UnrollMe3 { $args | %{ $_ } }
C:\> (UnrollMe3 a,b,c | measure).count
3
हालांकि, यह सब कुछ स्पष्ट नहीं होता ...
# as seen earlier - if we're truly returning @(@("a","b","c")) why not count=1?
C:\> (UnrollMe a,b,c).count
3
# our theory must also explain these results:
C:\> ((UnrollMe a,b,c) | measure).count
3
C:\> (@(@("a","b","c")) | measure).count
3
C:\> ((UnrollMe a,b,c d) | measure).count
2
मैं वहाँ खेल में एक और नियम क्या एक्सट्रपलेशन कर सकते हैं से: अगर आपके पास एक तत्व के साथ एक सरणी है और पार्सर expression mode में है, तो दुभाषिया तत्व को "अनचाहे" करेगा। मैं और अधिक subtleties मैं याद कर रहा हूँ?
WriteObject के समतुल्य लिखें-आउटपुट cmdlet (echo करने के लिए उपनाम) है जो लोग शायद ही कभी उपयोग करते हैं क्योंकि मूल्य stdout स्ट्रीम पर पूरी तरह से आउटपुट होते हैं। –
सच है, यद्यपि लिखने-आउटपुट में एक -अन्यूमेरेट कोलेक्शन पैरामीटर नहीं है जैसे WriteObject (ऑब्जेक्ट, बूल) करता है। –
संबंधित: http://stackoverflow.com/questions/28702588/in-what-conditions-does-powershell-unroll-items-in-the-pipeline/28707054#28707054 – alx9r