Подтвердить что ты не робот

Получение текущего хеш-ключа в цикле ForEach-Object в powershell

У меня есть хеш-таблица:

$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 ничего не возвращает. Я в тупике. Помогите?

4b9b3361

Ответ 1

Мне нравится использовать GetEnumerator() при циклизации хэш-таблицы. Он предоставит вам свойство value с объектом и свойство key с ним ключ/имя. Попробуйте:

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

Ответ 2

Вы также можете сделать это без переменной

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

Ответ 3

здесь функция similare, которую я использовал для чтения ini файла (значение также является словарем, как ваш).

ini файл, который я преобразую в хэш, выглядит следующим образом

[Section1]

key1=value1
key2=value2

[Section2]

key1=value1
key2=value2
key3=value3

Из ini hashtable выглядит так (я передал fonction, которые делают преобразование в хэш):

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

поэтому из хеш-таблицы эта строка будет искать весь ключ/значение для данного раздела:

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