从字符串输出格式化 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.