2013-02-14 7 views
13

Mam tabeli mieszania:Pierwsze obecny klawisz krzyżyka w pętli foreach-Object w powershell

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

robię pętlę przez uzyskać obiekty:

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

Działa dobrze, ale co mogę użyć, aby dowiedzieć się, który z kluczy $myHash jestem w? $_.Name nic nie zwraca. Jestem zdumiony. Wsparcie?

+0

OK, więc początkowo w lewo na zewnątrz „.keys” część $ myHash.keys w pętli zarówno tutaj, jak iw moim oknem testów, mimo że byli w rzeczywistej skryptu. Jak się okazuje, podanie wartości .keys powoduje, że działa. Ale kod Graimera działa również, nawet z moim pierwotnym błędem, więc dostaje znacznik wyboru. –

Odpowiedz

33

Lubię używać GetEnumerator() podczas zapętlania hashtable. Da ci to nieruchomość value z obiektem i właściwość key z jej kluczem/nazwą. Spróbuj:.

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

Dzięki! Doceniam to. Działa dobrze! –

+1

Inny popularny sposób to: $ hash.Keys | % {"klucz to: $ ($ _), wartość to $ ($ hash [$ _])"} –

+0

Robi to samo, ale wymaga wielu odczytów do hashtable i jest bardziej podatna na literówki –

5

Można również zrobić to bez zmiennej

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

tu similare funkcji Czytałem plik ini (wartości są również słownikiem jak Twoja).

ini że przekształci hash wyglądać następująco

[Section1] 

key1=value1 
key2=value2 

[Section2] 

key1=value1 
key2=value2 
key3=value3 

od ini Hashtable wyglądać następująco (Zdałem FONCTION że zrobić transformację w celu rozszyfrowania):

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

więc z tabeli skrótów ta linia wyszuka cały klucz/wartość dla danej sekcji:

$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.