大多数 PowerShell 脚本编写者可能会说,使用任何类似于 Format-Table 输出的文本表作为输入是个坏主意,但我喜欢挑战这一点,因为格式化的源表可以被人类阅读,而且人类可以阅读他们并确定例如关于列开始和结束的布局,程序应该能够做同样的事情......
在某些情况下(例如 StackOverflow 站点上的示例数据),它甚至可能比 CSV 等其他格式更方便(难以阅读且仅支持字符串数据) ,XML(非常冗长,因此也难以阅读)或JSON(或PSON,更适用于复杂数据,但不适用于对象列表包含简单的原生属性)
基于这个想法,我编写了一个可重复使用的 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 *
并且由于您的所有数据都是左对齐的(并且每一列都需要一个标题),因此可以从一开始就确定列布局,这意味着您甚至可以流这个表输入(假设@ 987654334@通过管道分别输出每一行:
.\Plink server@puttysession -pw "password" "command" | ConvertFrom-SourceTable
(意思是如果您将源表作为多行字符串提供,ConvertFrom-SourceTable cmdlet 将确定整个表的列女巫,否则它基于表头、过去和当前记录)子>
如果源表有更好的格式约定,例如“非字符串数据(需要解释的数据)右对齐”(实际上由 Format-Table 完成)。您可以假设(就像@Ansgar Wiechers 所做的那样)Mod 和 Ports 是整数一个事实。例如:
$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