2012-03-02 16 views
6

इसका उत्तर छोटा होने की संभावना है, लेकिन मैंने आधे घंटे बिताए हैं और अभी भी इसे काम नहीं कर सकते हैं।हैशटेबल मान वाले पावरहेल स्ट्रिंग को स्वरूपित करना

मान लें मैं एक निम्न hashtable है:

$hash = @{face='Off';} 

मैं क्या करने की कोशिश की, उत्पादन "चेहरे" का मान ओर के साथ कुछ अन्य स्ट्रिंग तत्व है।

यह काम करता है:

Write-Host Face $hash['face'] 
=> Face Off 

बहरहाल, यह नहीं करता है:

Write-Host Face/$hash['face'] 
=> Face/System.Collections.Hashtable[face] 

किसी तरह एक स्थान की कमी ऑपरेटर पूर्वता को प्रभावित किया है - यह अब एक स्ट्रिंग के रूप में $ हैश मूल्यांकन कर रही है, बाद में [चेहरे] concatenating।

इस पूर्वता समस्या को हल करने की कोशिश कर रहा है, मैं करने की कोशिश की:

Write-Host Face/($hash['face']) 
=> Face/ Off 

मैं अब एक अतिरिक्त स्थान मैं नहीं करना चाहती है। यह काम करता है, लेकिन मैं तो बस पुन: असाइन करने के लिए अतिरिक्त लाइन नहीं करना चाहती:

$hashvalue = $hash['face'] 
write-host Face/$hashvalue 
=> Face/Off 

किसी भी विचार कैसे एक एक लाइनर के रूप में इस काम के पाने के लिए?

उत्तर

9

ज़रूर, एक उपसूचक का उपयोग: आम तौर पर

Write-Host Face/$($hash['face']) 

, मैं सिर्फ मैं राइट-होस्ट के साथ खाली स्थान के अधिक सटीक नियंत्रण की जरूरत है एक स्ट्रिंग का उपयोग करना चाहते हैं,:

Write-Host "Face/$($hash['face'])" 

हाँ इस में, यदि आपको फिर से एक उप-संपीड़न की आवश्यकता है, लेकिन अधिक क्योंकि आप किसी स्ट्रिंग में $foo['bar'] जैसे अभिव्यक्ति को शामिल नहीं कर सकते हैं ;-)

वैसे, $hash.face बहुत कम दृश्य अव्यवस्था के साथ ही काम करता है।

+0

उपसूचक यहां महत्वपूर्ण था ($ में बंद())। मैं उनकी भूमिका के बारे में बेहद जागरूक था, लेकिन यहां प्रयोज्यता को याद किया था। – llevera

+0

दूसरों को जवाब देने का मौका देने के लिए अस्वीकार्य। ब्लॉक – llevera

3

ऐसे मामलों में, और अधिक यदि इसमें अधिक चर शामिल हैं, तो मैं स्ट्रिंग स्वरूपण का उपयोग करना पसंद करता हूं। इस मामले में आप $(..) के साथ रहती है, कि स्ट्रिंग स्वरूपण संदेह का बहुत कुछ निकाल देंगे बारे में पता, cruft हो सकता है और बेहतर बनाता है पठनीयता:

write-host ("Face/{0}" -f $hash['face']) 
+0

ब्लॉक से थोड़ा जल्दी था -फ विकल्प को इंगित करने के लिए धन्यवाद। मैंने कभी इसका उपयोग नहीं किया था, और मैं निश्चित रूप से देख सकता हूं कि यह अधिक जटिल परिदृश्यों को और अधिक प्रबंधनीय – llevera

+1

ल्लेवेरा कैसे बनाएगा, यह एक ऑपरेटर है, विकल्प नहीं। – Joey

1

जॉय के रूप में उप भाव उपयोग करने के अलावा आप से पता चला सकते हैं:

उपयोग स्ट्रिंग स्वरूपण:

Write-Host ('Face/{0}' -f $hash.face) 

यह {0}

उपयोग स्ट्रिंग संयोजन के स्थान पर चेहरे कुंजी का मान छड़ी जाएगा:

Write-Host ('Face/' + $hash.face) 
उन लोगों में से

दोनों एक अभिव्यक्ति का मूल्यांकन किया जाना है जो एक स्ट्रिंग जो Write-Host के Object पैरामीटर के रूप में प्रयोग किया जाता है आउटपुट की आवश्यकता है।

+0

मुझे लगता है कि यह ध्यान देने योग्य है कि लिखित होस्ट ('फेस /' + $ हैश.फेस) उदाहरण के लिए, ब्रैकेट महत्वपूर्ण हैं। उनके बिना, + को एक स्ट्रिंग शाब्दिक के रूप में माना जाता है। पावरहेल स्ट्रिंग स्वरूपण का उपयोग थोड़ा सा हो रहा है! – llevera

+0

@llevera हाँ माता-पिता पहले स्ट्रिंग concatenation निष्पादित करने के लिए PowerShell बताते हैं। आउटपुट एक सिस्टम है। स्ट्रिंग ऑब्जेक्ट जिसका उपयोग 'लिखें-होस्ट-ऑब्जेक्ट' पैरामीटर मान के रूप में किया जाता है। –

0

एक अन्य विकल्प राइट-होस्ट की -Separator विकल्प के साथ अपने स्लेश डालने के लिए है:

$hash = @{Face="off"} 
Write-Host ("Face",$hash.Face) -Separator '/' 
संबंधित मुद्दे