gpt4 book ai didi

powershell - 将以空格分隔的 PowerShell 输出解析为表格

转载 作者:行者123 更新时间:2023-12-03 12:21:01 34 4
gpt4 key购买 nike

PowerShell 在运行命令时返回此输出:

PS Output

Mod  Ports  Module-Type                         Model              Status---  -----  -----------                         ------------------ ----------1    48     2/4/8/10/16 Gbps Advanced FC Module DS-X9448-768K9     ok2    48     2/4/8/10/16 Gbps Advanced FC Module DS-X9448-768K9     ok3    0      Supervisor Module-3                 DS-X97-SF1-K9      ha-standby4    0      Supervisor Module-3                 DS-X97-SF1-K9      active *

I'm having trouble trying to split it, because it's not tab-separated, is space-separated, therefore when i use .split("") the column Module-Type is being separated incorrectly because its content also has spaces.

I'm new at this, any help would be appreciated.

Here's my code:

$RS = .\Plink server@puttysession -pw "password" "command"

foreach ($RSln in $RS){
$arr = $RSln.split('',[System.StringSplitOptions]::RemoveEmptyEntries)
Write-Host $RSln "|" $arr.Length
}

这给了我创建的数组的行和长度,前两行是长度为 5 的数组,第三和第四行有 9 个项目,因为 ModuleType

最佳答案

大多数 PowerShell 脚本编写者可能会说使用类似于 Format-Table 输出的任何文本表作为输入是个坏主意,但我想挑战一下,因为可以读取格式化的源表由人类以及人类是否可以阅读它们并确定例如关于列开始和结束位置的布局,程序应该能够做同样的事情......

在某些情况下(例如 StackOverflow 站点上的示例数据),它甚至可能比其他格式更方便,例如 CSV(难以阅读且仅支持字符串数据)、XML(非常冗长,因此也难以阅读)或 JSON(或 PSON这更适合复杂数据,但不适合包含简单 native 属性的对象列表)

基于这个想法我写了一个可重用的ConvertFrom-SourceTable cmdlet可在 PowerShell Gallery 下载,源代码来自 GitHub iRon7/ConvertFrom-SourceTable存储库。

在您的情况下,将表转换为对象的命令与 $RS | 一样简单ConvertFrom-SourceTable,让我证明一下:

$RS = '
Mod Ports Module-Type Model Status
--- ----- ---------------------------------- ------------------ -----------
1 48 2/4/8/10/16 Gbps Advance FC Module DS-X9448-768K9 ok
2 48 2/4/8/10/16 Gbps Advance FC Module DS-X9448-768K9 ok
3 0 Supervisor Module-3 DS-X97-SF1-K9 ha-standby
4 0 Supervisor Module-3 DS-X97-SF1-K9 active *
'

$RS | ConvertFrom-SourceTable

Status : ok
Model : DS-X9448-768K9
Ports : 48
Mod : 1
Module-Type : 2/4/8/10/16 Gbps Advance FC Module

Mod : 2
Module-Type : 2/4/8/10/16 Gbps Advance FC Module
Ports : 48
Model : DS-X9448-768K9
Status : ok

Mod : 3
Module-Type : Supervisor Module-3
Ports : 0
Model : DS-X97-SF1-K9
Status : ha-standby

Mod : 4
Module-Type : Supervisor Module-3
Ports : 0
Model : DS-X97-SF1-K9
Status : active *

由于您的所有数据都是左对齐的(并且每列都需要一个标题),因此可以从一开始就确定列布局,这意味着您甚至可以此表输入(假设.\Plink 通过管道分别输出每一行):

.\Plink server@puttysession -pw "password" "command" | ConvertFrom-SourceTable

(意思是如果您将源表作为多行字符串提供,ConvertFrom-SourceTable cmdlet 将确定整个表的列女巫,否则它基于表头,过去和现在的记录)

如果源表有更好的格式约定,如“非字符串数据(需要解释的数据)右对齐”(实际上由 Format-Table 完成)。您可以假设(正如@Ansgar Wiechers 所做的那样)ModPorts 是整数这一事实。例如:

$Object = ConvertFrom-SourceTable '
Mod Ports Module-Type Model Status
--- ----- ----------- ----- ------
1 48 2/4/8/10/16 Gbps Advance FC Module DS-X9448-768K9 ok
2 48 2/4/8/10/16 Gbps Advance FC Module DS-X9448-768K9 ok
3 0 Supervisor Module-3 DS-X97-SF1-K9 ha-standby
4 0 Supervisor Module-3 DS-X97-SF1-K9 ha-standby
'

(请注意,在此示例中,$Object | Format-Table 将提供与输入相同的输出)

有关更多示例,请使用帮助:Help ConvertFrom-SourceTable -Full

关于powershell - 将以空格分隔的 PowerShell 输出解析为表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51200054/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com