Преобразование хэш-таблицы в массив строк
Как преобразовать хэш-таблицу в массив строк?
Предположим, что $l_table является хэш-таблицей. Если я попытаюсь
$l_array = $l_table | format-table
Тогда $l_array-это массив, но массив объектов FormatEntryData.
Если я это сделаю
[string[]]$l_array = $l_table | format-table
Тогда $l_array-это массив строк,но все строки - " Microsoft.PowerShell.Команды.Внутренний.Формат.FormatEntryData". Если я попытаюсь
$l_array = $l_table | out-string
Тогда $l_array-это одна строка. Я перепробовал много других вещей, но ничего не работает, кроме ручного перебора, чего я действительно не хочу делать.
4 ответов:
Собственный ответ Дэвида И. Макинтоша работает хорошо, но следует отметить, что элементы результирующего массива соответствуют всем строкам вывода по умолчанию, который включает:
- пустые начальные и конечные строки
- две строки заголовка (строка с именами столбцов и разделительная строка)
Out-Stringпросто отправляет то, что вы обычно видите в консоли (терминале) в строку, по умолчанию в виде одиночной строки, и с-Streamв видемассива строк.Вот вариант команды Дэвида, которая удаляет как заголовок, так и пустые строки:
[string[]] $l_array = ($l_table | out-string -stream) -notmatch '^$' | select -Skip 2
Остальная часть этого ответа показывает , какуправлять строковым представлением, полученным ; он использует синтаксис PS v3+ для краткости.
Примечание: Для наглядности пример входной хэш-таблицы называется
$ht(не$l_table) в следующих примерах.
Получить все ключи в виде массив строк:
$ht.Keys | % ToStringПолучить все значения в виде строкового массива:
$ht.Values | % ToStringПолучите пользовательское представление пар ключ-значение в формате
<key>=<value>; обратите внимание, что.GetEnumerator()необходимо отправлять пары ключ-значение по отдельности через канал; по умолчанию PowerShell передает хэш-таблицу в целом :$ht.GetEnumerator() | % { "$($_.Name)=$($_.Value)" }Обратите внимание, что в то время как
.ToString(), который также применяется неявно во время интерполяции, работает ну, с встроенными типами .NET, другие типы будут просто в общем случае печатать свое полноеимя типа , если их метод.ToString()не будет переопределен для возврата более значимого пользовательского представления (что, к счастью, часто имеет место с типами, возвращаемыми командлетами PowerShell).Простой пример выбора свойства значения для представления его в строке:
# Sample hashtable containing a value of a non-built-in type, # [System.Diagnostics.Process] $ht = @{ one = 1; two = $(Get-Process -ID $PID) } # Use the `.Path` property to represent the value. $ht.GetEnumerator() | % { "$($_.Name)=$($_.Value.Path)" }
Хэш-это просто хэш-таблица, поэтому она имеет свойство keys и values.
$hash = @{} $hash["foo"] = "bob" $hash.Values $hash.Values | Out-string
Если вы хотите получить перечислитель, он вернет вам keyvaluepair
$hash.GetEnumerator() |%{$_ | out-string}
Это обычная проблема; хеш-таблица должна быть получена либо ключами, либо значениями, но вы не можете получить коллекцию пар - это то, что является исходной хеш-таблицей, в конце концов. В моем примере хэш-таблица представлена "словарем" (вы помните из VBS :-). Однако вам нужно будет определить разделитель для разграничения ключей и значений, в этом случае "ключ значение"
$ARRAY = ( $DICT.Keys | foreach-object { "$_<->$($DICT[$_])"})Вы даже можете сначала отсортировать ключи, если хотите. В этом случае я поменял значение на ключ и отсортировал по ценности. Я также немного расширил строку, чтобы сделать ее более многословной, но разборчивой:
$ARRAY = ( $DICT.Keys | foreach-object { $DICT[$_] + "<--->" + $_} | sort-object)
Comments