2013-02-14 8 views
13

Ho una tabella di hash:Ottenere il tasto cancelletto corrente in un ciclo foreach-Object in PowerShell

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

che sto facendo un ciclo attraverso per ottenere gli oggetti:

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

Funziona bene, ma cosa posso usare per capire quale dei tasti di $myHash sono dentro? $_.Name non restituisce nulla. Sono perplesso. Aiuto?

+0

OK, quindi ho inizialmente escluso la parte ".keys" di $ myHash.keys nel ciclo sia qui che nella finestra di test, anche se erano nello script effettivo. Come risulta, la specifica del valore .keys lo fa funzionare. Ma anche il codice di Graimer funziona, anche con il mio errore originale, quindi ottiene il segno di spunta. –

risposta

33

Mi piace utilizzare GetEnumerator() durante il loop di una tabella hash. Ti darà una proprietà value con l'oggetto e una proprietà key con la sua chiave/nome. Prova:.

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

Grazie! Lo apprezzo. Funziona bene! –

+1

Un altro modo comune è: $ hash.Keys | % {"è la chiave: $ ($ _), il valore è $ ($ hash [$ _])"} –

+0

Fa lo stesso, ma richiede più letture per l'hashtable ed è più incline agli errori di battitura –

5

È anche possibile fare questo senza un

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

qui una funzione similare variabili che ho usato per leggere il file ini (il valore sono anche un dizionario come la tua).

file di

ini che trasformo in aspetto hash come questo

[Section1] 

key1=value1 
key2=value2 

[Section2] 

key1=value1 
key2=value2 
key3=value3 

Dal ini l'aspetto tabella hash come questo (ho passato la fonction che fanno la trasformazione in a hash):

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

così dalla tabella hash questa linea cercherà tutte le chiavi/valori per una determinata sezione:

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

Problemi correlati