大多数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 *
由于您的所有数据都是左对齐的(每列都需要一个标题),因此可以从一开始确定列的布局,这意味着您甚至可以通过管道 流式传输 此表输入(假设.\Plink
将每行单独输出):
.\Plink server@puttysession -pw "password" "command" | ConvertFrom-SourceTable
(意思是,如果您将源表格作为多行字符串提供,则 ConvertFrom-SourceTable
命令会确定整个表格的列宽,否则它基于标题、过去和当前记录)
如果源表格采用更好的格式约定,如“非字符串数据(需要解释的数据)右对齐”(实际上由 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