У меня есть структура данных для многоуровневой справочной таблицы, которая выглядит примерно так
$lookupTable = @{
'a' = @{
'a1' = 'A One'
'a2' = 'A Two'
'a3' = 'A Three'
}
'b' = @{
'b1' = 'B One'
'b2' = 'B Two'
'b3' = 'B Three'
}
}
Я использую такую структуру данных, чтобы передать произвольное количество новых и измененных значений для обновления таблицы, вот так.
$hash=@{'a'=@{'a4'='A Four'}
'b'=@{'b4'='B Four'}
'c'=@{'c1'='C One'
'c2'='C Two'
}
}
Затем я могу использовать вложенные циклы foreach, чтобы получить имена ключей для добавления или обновления.
Однако мне также нужно извлечь только одно значение, и я хочу сохранить похожую структуру данных, чтобы я мог передать только одну хеш-таблицу, чтобы точно указать, какое значение я ищу, например, $getValue = @{'b'='b1'}
.
Но для этого мне нужно получить имя ключа по первому (единственному) индексу.Я пробовал
Write-Host "$($getValue.GetEnumerator[0])"
Write-Host "$($getValue.keys.GetEnumerator[0])"
Write-Host "$($getValue.GetEnumerator[1])"
Write-Host "$($getValue.keys.GetEnumerator[1])"
и ни одна не работает.Я мог бы снова использовать foreach, который будет выглядеть только один раз, но это выглядит не элегантно.Итак, что я делаю не так?
РЕДАКТИРОВАТЬ: Просто чтобы убедиться, что подход на основе цикла работает, я сделал это
foreach ($key in $getValue.keys) {
if ($key) {
Write-Host "$key $($getValue.$key) = $($lookupTable.$key.($getValue.$key))"
}
break
}
, и он действительно возвращается с b b1 = B единица.но какой уродливый способ сделать это.
Черт, все ближе!$key = $getValue.keys[0]
предоставляет ключ b .Но $value = $getValue.$key
не возвращает b1 , как ожидалось.Тем не менее, $value = $getValue[$key]
делает!однако попытка $ key = $ getValue.keys [0] $ value = $ getValue [$ key]
Write-Host "$key $($getValue[$key]) = $($lookupTable.$key.$value)"
не вернет фактическое окончательное значение.Grr.Еще кофе и попробуйте еще раз.
АГА!$ getValue.keys [0] не возвращает строку.Но если вы приведете к строке, то все будет в порядке.Так что
$key = [string]$getValue.keys[0]
$value = $getValue.$key
Write-Host "$key $value = $($lookupTable.$key.$value)"
доставляет удовольствие.Поэтому я ответил на свой вопрос.Думаю, я позволю модам решить, может ли это быть полезным для других или просто должно быть удалено.