从字符串输出格式化 table
Format table from output of a string
我尝试了不同的方法,但无法将数据格式化为 table
$str1 = "First string"
$str2 = "Sec string"
$str3 = "third str"
$str4 = "fourth string"
$str = "$str1 $str2 `r`n"
$str+= "$str3 $str4"
write-host $str | Format-Table
我希望创建如下所示的输出:
First string Sec string
third str fourth string
为了按预期使用 Format-Table
,您需要具有属性 的 object 而不仅仅是字符串:
$str -split "`r`n" | ForEach-Object {
# Initialize a custom object whose properties will reflect
# the input line's tokens (column values).
$obj = New-Object PSCustomObject; $i = 0
# Add each whitespace-separated token as a property.
foreach ($token in -split $_) {
Add-Member -InputObject $obj -NotePropertyName ('col' + ++$i) -NotePropertyValue $token
}
# Output the custom object.
$obj
} | Format-Table -HideTableHeaders
$str -split "`r`n"
将 multi-line 字符串拆分成单独的行,并通过管道将它们一一发送。
ForEach-Object
命令从每一行构造一个自定义的object,其属性是行中的whitespace-separated标记,如注释中所述; 属性 名称 - 与输出无关 - 是 auto-generated as col1
, col2
, ...
注意:这不与您想要的输出完全匹配each space (运行 of whitespace) 被视为分隔符。如果您想将原始 $str1
、$str2
、...变量值(例如 First string
)每个都视为 单个 列值,你必须假设关于如何标记该行。
例如,如果假设 2 个连续的单词 形成一个值,请将上面的 -split $_
替换为 $_ -split '(\w+ \w+) ?' -ne ''
如果您不想依赖假设,您必须使用嵌入引号构造输入字符串,以便明确指示标记边界(然后必须修改代码以正确解析嵌入引号)。
Format-Table
然后以表格形式显示自定义 objects,列正确对齐; -HideTableHeaders
抑制 header 行(auto-generated 属性 名称)。
根据您的示例输入,上面的代码生成了以下内容,生成了 没有 -HideTableHeaders
以便更好地说明代码的作用:
col1 col2 col3 col4
---- ---- ---- ----
First string Sec string
third str fourth string
同上,但使用 2-consecutive-words 拆分逻辑:
col1 col2
---- ----
First string Sec string
third str fourth string
至于你尝试了什么:
不要使用Write-Host
产生数据输出:Write-Host
输出(默认)到console和绕过管道,所以Format-Table
没有接收到输入,在这里没有效果。
就是说,即使 Format-Table
接收了输入(通过单独使用 $str
, 没有 Write-Host
,即:$str | Format-Table
),它对 strings 没有(可见的)影响,always 呈现as-is.
我尝试了不同的方法,但无法将数据格式化为 table
$str1 = "First string"
$str2 = "Sec string"
$str3 = "third str"
$str4 = "fourth string"
$str = "$str1 $str2 `r`n"
$str+= "$str3 $str4"
write-host $str | Format-Table
我希望创建如下所示的输出:
First string Sec string
third str fourth string
为了按预期使用 Format-Table
,您需要具有属性 的 object 而不仅仅是字符串:
$str -split "`r`n" | ForEach-Object {
# Initialize a custom object whose properties will reflect
# the input line's tokens (column values).
$obj = New-Object PSCustomObject; $i = 0
# Add each whitespace-separated token as a property.
foreach ($token in -split $_) {
Add-Member -InputObject $obj -NotePropertyName ('col' + ++$i) -NotePropertyValue $token
}
# Output the custom object.
$obj
} | Format-Table -HideTableHeaders
$str -split "`r`n"
将 multi-line 字符串拆分成单独的行,并通过管道将它们一一发送。ForEach-Object
命令从每一行构造一个自定义的object,其属性是行中的whitespace-separated标记,如注释中所述; 属性 名称 - 与输出无关 - 是 auto-generated ascol1
,col2
, ...注意:这不与您想要的输出完全匹配each space (运行 of whitespace) 被视为分隔符。如果您想将原始
$str1
、$str2
、...变量值(例如First string
)每个都视为 单个 列值,你必须假设关于如何标记该行。
例如,如果假设 2 个连续的单词 形成一个值,请将上面的-split $_
替换为$_ -split '(\w+ \w+) ?' -ne ''
如果您不想依赖假设,您必须使用嵌入引号构造输入字符串,以便明确指示标记边界(然后必须修改代码以正确解析嵌入引号)。
Format-Table
然后以表格形式显示自定义 objects,列正确对齐;-HideTableHeaders
抑制 header 行(auto-generated 属性 名称)。
根据您的示例输入,上面的代码生成了以下内容,生成了 没有 -HideTableHeaders
以便更好地说明代码的作用:
col1 col2 col3 col4
---- ---- ---- ----
First string Sec string
third str fourth string
同上,但使用 2-consecutive-words 拆分逻辑:
col1 col2
---- ----
First string Sec string
third str fourth string
至于你尝试了什么:
不要使用
Write-Host
产生数据输出:Write-Host
输出(默认)到console和绕过管道,所以Format-Table
没有接收到输入,在这里没有效果。就是说,即使
Format-Table
接收了输入(通过单独使用$str
, 没有Write-Host
,即:$str | Format-Table
),它对 strings 没有(可见的)影响,always 呈现as-is.