有没有办法将文本表转换为PowerShell对象

时间:2011-04-21 18:21:12

标签: regex powershell text-parsing

有许多工具以表格格式输出数据。一个这样的例子是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上使用Lee Holmes的脚本Convert-TextToObject,但不太确定从哪里开始。

5 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

从战略角度来看,我会尝试将您的文本文件转换为正确的CSV(逗号分隔值)文件,然后使用Import-Csv

答案 2 :(得分:0)

我昨天做了这个:)。您可以使用out-datatable将数据转换为System.DataTable。在poshcode获取。

有关详细信息,请参阅我最近的entry

答案 3 :(得分:0)

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

答案 4 :(得分:0)

使用此ConvertFrom-SourceTable cmdlet:

$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
...

(这也意味着您也可以对上述显示结果进行完整的往返)