2013-02-14 25 views
13

मैं एक हैश तालिका मिल गया है:हो रही powershell में एक foreach-वस्तु पाश में वर्तमान हैश कुंजी

$myHash = @{ 
    "key1" = @{ 
     "Entry 1" = "one" 
     "Entry 2" = "two" 
    } 
    "key 2" = @{ 
     "Entry 1" = "three" 
     "Entry 2" = "four" 
    } 
} 

मैं वस्तुओं के माध्यम से प्राप्त करने के लिए एक पाश कर रहा हूँ:

$myHash.keys | ForEach-Object { 
    Write-Host $_["Entry 1"] 
} 

ठीक काम करता है, लेकिन मैं यह जानने के लिए क्या उपयोग कर सकता हूं कि $myHash की कौन सी कुंजी मैं अंदर हूं? $_.Name कुछ भी वापस नहीं करता है। मैं उलझन में हूं। मदद?

+0

ठीक है, तो मैं शुरू में बाहर $ myHash.keys की ".keys" भाग पाश दोनों यहाँ और मेरे परीक्षण विंडो में छोड़ दिया है, भले ही वे वास्तविक लिपि में थे। जैसा कि यह पता चला है, .keys मान निर्दिष्ट करने से यह काम करता है। लेकिन ग्रीमर का कोड भी मेरी मूल गलती के साथ भी काम करता है, इसलिए उसे चेकमार्क मिल जाता है। –

उत्तर

33

मुझे हैशटेबल को लूप करते समय GetEnumerator() का उपयोग करना पसंद है। यह आपको ऑब्जेक्ट के साथ value और इसकी संपत्ति/नाम के साथ key संपत्ति प्रदान करेगा। प्रयास करें:।

$myHash.GetEnumerator() | % { 
    Write-Host "Current hashtable is: $($_.key)" 
    Write-Host "Value of Entry 1 is: $($_.value["Entry 1"])" 
} 
+0

धन्यवाद! मैं इसकी सराहना करता हूं। अच्छा काम करता है! –

+1

एक और आम तरीका है: $ हैश.केस | % {"कुंजी है: $ ($ _), मान $ ($ हैश [$ _])"} –

+0

यह वही करता है, लेकिन हैशटेबल को एकाधिक पढ़ना आवश्यक है और टाइपो से अधिक प्रवण है –

5

तुम भी एक चर

@{ 
    'foo' = 222 
    'bar' = 333 
    'baz' = 444 
    'qux' = 555 
} | % getEnumerator | % { 
    $_.key 
    $_.value 
} 
2
यहाँ

एक similare समारोह मैं INI फ़ाइल को पढ़ने के लिए प्रयोग किया जाता है के बिना ऐसा कर सकते हैं (मूल्य भी आपके जैसी शब्दकोश कर रहे हैं)।

$Inihash = @{ 
      "Section1" = @{ 
       "key1" = "value1" 
       "key2" = " value2" 
      } 
      "Section2" = @{ 
       "key1" = "value1" 
       "key2" = "value2" 
     "key3" = "value3" 
      } 
     } 
:

INI फ़ाइल है कि मैं इस

[Section1] 

key1=value1 
key2=value2 

[Section2] 

key1=value1 
key2=value2 
key3=value3 

आरं से की तरह हैश नज़र में बदलना इस तरह hashtable नज़र (i fonction कि हैश में परिवर्तन कर पारित कर दिया)

इसलिए हैश तालिका से यह लाइन किसी दिए गए सेक्शन के लिए सभी कुंजी/मान खोजेगी:

$Inihash.GetEnumerator() |?{$_.Key -eq "Section1"} |% {$_.Value.GetEnumerator() | %{write-host $_.Key "=" $_.Value}} 

? = for search where-object equal my section name. % = you have to do 2 enumeration ! one for all the section and a second for get all the key in the section.