Получение текущего хеш-ключа в цикле 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
ничего не возвращает. Я в тупике. Помогите?
Ответы
Ответ 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.