从字符串输出格式化表格

时间:2018-07-04 15:51:04

标签: powershell format tabular

我尝试了不同的方法,但是无法将数据格式化为表格

$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

1 个答案:

答案 0 :(得分:3)

要按预期使用Format-Table,您需要具有属性的对象而不是仅仅使用字符串:

$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"将多行字符串分割成几行,并通过管道将它们逐一发送。

  • ForEach-Object命令从每行构造一个自定义对象,其属性是该行上用空格分隔的标记,如注释中所述;属性名称-与输出无关紧要-自动生成为col1col2,...

    • 注意:在 每个空间(空白行)为视为分隔符。如果您想将原始$str1$str2,...变量值(例如First string)都视为单个列值,则可以必须做出关于如何标记该行的假设
      例如,如果假设是 2个连续单词形成一个单一值,则将上面的-split $_替换为$_ -split '(\w+ \w+) ?' -ne ''

    • 如果您不想依靠假设 ,则必须使用嵌入引号<< / em> ,以便明确指示令牌边界(然后必须修改代码以正确解析嵌入的引用)。

  • Format-Table然后以表格形式显示自定义对象,并正确对齐各列; -HideTableHeaders禁止显示标题行(自动生成的属性名称)。

使用您的示例输入,上面的代码会产生以下内容,这些内容没有 -HideTableHeaders,以便更好地说明代码的作用:

col1  col2   col3   col4
----  ----   ----   ----
First string Sec    string
third str    fourth string

同上,但具有2个连续单词的分割逻辑:

col1         col2
----         ----
First string Sec string
third str    fourth string

关于您尝试过的事情:

  • 请勿使用Write-Host生成 data 输出:Write-Host的输出(默认情况下)进入控制台绕过管道,因此Format-Table在此不接收任何输入,也不起作用。

  • 也就是说,即使Format-Table 收到输入(通过单独使用$str,也没有使用{em> Write-Host ,即$str | Format-Table),它对字符串(总是按原样呈现 )的字符串没有(可见)影响。