【问题标题】:Is there a way to convert tables of text into a PowerShell Object有没有办法将文本表转换为 PowerShell 对象
【发布时间】:2023-03-17 08:53:01
【问题描述】:

有许多工具以表格格式输出数据。一个这样的例子是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 的一次性解决方案。

我试图弄清楚如何在名为Convert-TextToObject 的 Poshcode 上使用 Lee Holmes 的脚本,但不太确定从哪里开始。

【问题讨论】:

  • 首先是概括代码以处理项目列表。链接中的代码可用于生成每个对象(例如,每行运行一次,不包括标题)。然后它只是从标题行中提取“格式”。优化可以稍后进行。应该是一个有趣的小项目。

标签: regex powershell text-parsing


【解决方案1】:

使用这个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
...

(这也意味着你也可以在上面的显示结果上做一个完整的往返)

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      【解决方案3】:

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

      更多详情请看我最近的entry

      【讨论】:

        【解决方案4】:
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2020-01-08
          • 2018-04-09
          • 2020-09-18
          • 2011-12-10
          • 1970-01-01
          • 2011-02-02
          • 2022-07-06
          • 1970-01-01
          • 2021-07-10
          相关资源
          最近更新 更多