Есть ли способ преобразовать текстовые таблицы в объект PowerShell?

Есть много инструментов, которые выводят свои данные в виде таблицы. Одним из таких примеров является diskpart. Отбросив некоторые посторонние выходы, вы получите что-то вроде этого.

Disk ###  Status         Size     Free     Dyn  Gpt
--------  -------------  -------  -------  ---  ---
Disk 0    Online          136 GB      0 B
Disk 1    Offline         136 GB   136 GB
Disk 2    Reserved       1027 MB      0 B        *
Disk 3    Reserved        500 GB      0 B        *
Disk 4    Reserved        500 GB      0 B        *
Disk 5    Reserved         10 GB      0 B        *
Disk 6    Reserved         13 GB      0 B        *
Disk 7    Reserved       4102 MB      0 B        *
Disk 8    Reserved       7169 MB      0 B        *
Disk 9    Reserved        503 GB      0 B        *
Disk 10   Reserved        506 GB      0 B        *
Disk 11   Reserved        500 GB      0 B        *
Disk 12   Reserved       3891 GB      0 B        *
Disk 13   Reserved        500 GB      0 B        *
Disk 14   Reserved       3891 GB      0 B        *
Disk 15   Reserved       1843 GB      0 B
Disk 16   Reserved       3072 GB      0 B        *
Disk 17   Reserved       2048 GB      0 B        *
Disk 18   Reserved        808 GB      0 B        *
Disk 19   Reserved        805 GB      0 B        *
Disk 20   Reserved       3891 GB      0 B        *
Disk 21   Reserved       3891 GB      0 B        *
Disk 22   Reserved       3891 GB      0 B        *
Disk 23   Reserved       6144 GB      0 B        *

Другой пример — netstat, который выглядит следующим образом:

 Proto  Local Address          Foreign Address        State
 TCP    0.0.0.0:80             7ANDYS:0               LISTENING
 TCP    0.0.0.0:135            7ANDYS:0               LISTENING
 TCP    0.0.0.0:443            7ANDYS:0               LISTENING
 TCP    0.0.0.0:445            7ANDYS:0               LISTENING
 TCP    0.0.0.0:1025           7ANDYS:0               LISTENING
 TCP    0.0.0.0:1026           7ANDYS:0               LISTENING
 TCP    0.0.0.0:1027           7ANDYS:0               LISTENING
 TCP    0.0.0.0:1028           7ANDYS:0               LISTENING
 TCP    0.0.0.0:1029           7ANDYS:0               LISTENING
 TCP    0.0.0.0:2048           7ANDYS:0               LISTENING

Я пытаюсь выяснить, существует ли достаточно повторяемый способ преобразования данных этого типа в объект, чтобы свойства объекта были заголовками в первой строке. Я знаю, что существует множество способов сделать это для вывода отдельных инструментов с использованием регулярных выражений, но я ищу больше стратегии, как решить эту проблему, а не одноразовое решение только для diskpart или netstat.

Я пытался понять, как использовать сценарий Ли Холмса в Poshcode под названием Convert-TextToObject, но не смог. совершенно уверен, с чего начать.


person Andy Schneider    schedule 21.04.2011    source источник
comment
Во-первых, просто обобщить код для работы со списком элементов. Код в ссылке можно использовать для создания каждого объекта (например, запускать один раз для каждой строки, исключая заголовок). Затем он просто извлекает «формат» из строки (строк) заголовка. Оптимизация может появиться позже. Должен быть забавный маленький проект.   -  person    schedule 21.04.2011


Ответы (5)


Вы видели это: http://thepowershellguy.com/blogs/posh/archive/2007/03/24/hey-powershell-guy-how-can-i-parse-a-tab-delimited-файл-и-затем-сохраните-это-как-запятые-разделенные-значения-file.aspx Это может быть что ты ищешь.

person dawebber    schedule 21.04.2011

Со стратегической точки зрения я бы попытался преобразовать ваш текстовый файл в правильный файл CSV (значения, разделенные запятыми), а затем использовать Import-Csv.

person JPBlanc    schedule 21.04.2011

Я сделал это вчера :). Вы можете использовать out-datatable для преобразования ваших данных в файл System.DataTable. Получите его по адресу почтовый код.

Дополнительные сведения см. в моей недавней записи.

person Emiliano Poggi    schedule 22.04.2011

Кое-что для примера netstat:

get-content netstat.txt | select -skip 1 | 
ConvertFrom-String -propertynames blank,proto,local,foreign,state | 
select * -ExcludeProperty blank

proto local        foreign  state
----- -----        -------  -----
TCP   0.0.0.0:80   7ANDYS:0 LISTENING
TCP   0.0.0.0:135  7ANDYS:0 LISTENING
TCP   0.0.0.0:443  7ANDYS:0 LISTENING
person js2010    schedule 02.07.2019

С помощью этого командлета ConvertFrom-SourceTable:

$DiskPart | ConvertFrom-SourceTable -Literal | Format-Table

Disk ### Status   Size    Free   Dyn Gpt
-------- ------   ----    ----   --- ---
Disk 0   Online   136 GB  0 B
Disk 1   Offline  136 GB  136 GB
Disk 2   Reserved 1027 MB 0 B        *
Disk 3   Reserved 500 GB  0 B        *
Disk 4   Reserved 500 GB  0 B        *
...

$NetStat | ConvertFrom-SourceTable -Literal | Format-Table

Proto Local Address Foreign Address State
----- ------------- --------------- -----
TCP   0.0.0.0:80    7ANDYS:0        LISTENING
TCP   0.0.0.0:135   7ANDYS:0        LISTENING
TCP   0.0.0.0:443   7ANDYS:0        LISTENING
TCP   0.0.0.0:445   7ANDYS:0        LISTENING
...

(Это также означает, что вы также можете выполнить полный круговой обход приведенных выше результатов отображения)

person iRon    schedule 27.03.2020