Преобразование хэш-таблицы в массив строк



Как преобразовать хэш-таблицу в массив строк?
Предположим, что $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-это одна строка. Я перепробовал много других вещей, но ничего не работает, кроме ручного перебора, чего я действительно не хочу делать.

536   4  

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)" }
[string[]]$l_array = $l_table | out-string -stream

Хэш-это просто хэш-таблица, поэтому она имеет свойство 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

    Ничего не найдено.