2012-02-08 15 views
10

के बीच इंटरपोल करते समय सरणी आइटम आउटपुट करते हुए मुझे पावरहेल में एरे और डबल कोट्स के आस-पास कुछ अजीब व्यवहार मिला। अगर मैं बना सकते हैं और इस तरह के रूप एक सरणी में पहला तत्व प्रिंट,:पावरहेल डबल कोट्स

$test = @('testing') 
echo $test[0] 

Output:  
testing 

सब कुछ ठीक काम करता है। लेकिन अगर मैं इसे दोहरे उद्धरण चिह्नों के रख:

echo "$test[0]" 

Output: 
testing[0] 

केवल $ परीक्षण चर का मूल्यांकन किया गया था और सरणी [0] मार्कर एक स्ट्रिंग के रूप सचमुच इलाज किया गया था। आसान फिक्स केवल डबल कोट्स में इंटररोलिंग सरणी चर से बचने के लिए है, या उन्हें पहले किसी अन्य चर को असाइन करें। लेकिन मैं सोच रहा था कि यह व्यवहार डिज़ाइन द्वारा है या नहीं?

+0

यह स्पष्ट नहीं है, लेकिन आखिरकार यह एक डुप्लिकेट है [आप किसी ऑब्जेक्ट की संपत्ति को डबल-उद्धृत स्ट्रिंग में कैसे उपयोग कर सकते हैं?] (Http://stackoverflow.com/q/ 1145704/45375)। – mklement0

उत्तर

15

तो जब आप इंटरपोलेशन का उपयोग कर रहे हैं, तो डिफ़ॉल्ट रूप से यह केवल अगले चर को इंटरपोलेट करता है। तो जब आप ऐसा करते हैं:

"$test[0]" 

यह अगले चर के रूप में $ परीक्षण देखता है, यह पता चलता है कि इस एक सरणी है और यह एक सरणी प्रदर्शित करने के लिए कोई अच्छा तरीका है, तो यह निर्णय लेता है यह अंतर्वेशन नहीं कर सकता है कि और केवल एक स्ट्रिंग के रूप में स्ट्रिंग प्रदर्शित करता है।

"$($test[0])" 

ध्यान दें कि यह व्यवहार मेरी मुख्य कारण से एक है स्वरूपित तार का उपयोग कर के बजाय प्रक्षेप पर भरोसा करने के लिए:

"{0}" -f $test[0] 
समाधान स्पष्ट रूप से powershell बताने के लिए जहां बिट शुरू होता है अंतर्वेशन के लिए और जहां यह बंद हो जाता है
+0

मैंने वापस जाने और कोड टैग जोड़ने पर बहस की, धन्यवाद @ एंडी अरिस्मिन्दी। – EBGreen

+1

आपके समाधान प्रभावी हैं, लेकिन आपकी व्याख्या सही नहीं है। स्ट्रिंग इंटरपोलेशन _syntactically_ केवल '$ ' पार्स करने के लिए सीमित है। किसी भी वर्ण जो एक चर नाम में मान्य नहीं है पार्सिंग रोकता है, जैसे '[' इस मामले में। PowerShell खुशी से तत्वों (डिफ़ॉल्ट रूप से) के बीच एक ही स्थान के साथ तत्वों को अलग करके _entire_ array '$ test' का विस्तार करता है। निम्नलिखित '[0] 'को केवल शाब्दिक माना जाता है और इस पर कोई असर नहीं पड़ता कि' $ test' को स्ट्रिंग में कैसे परिवर्तित किया जाता है। – mklement0

6

ऐसे मामलों में आपको क्या करना है:

echo "$($test[0])" 

एक अन्य विकल्प स्ट्रिंग स्वरूपण का उपयोग है

echo "this is {0}" -f $test[0] 

ध्यान दें कि यह तब होगा जब आप तारों में गुणों तक पहुंच रहे हों। "$a.Foo" की तरह - "$($a.Foo)"

संबंधित मुद्दे