我尝试了不同的方法,但是无法将数据格式化为表格
$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
答案 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
命令从每行构造一个自定义对象,其属性是该行上用空格分隔的标记,如注释中所述;属性名称-与输出无关紧要-自动生成为col1
,col2
,...
注意:在 每个空间(空白行)为视为分隔符。如果您想将原始$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
),它对字符串(总是按原样呈现 )的字符串没有(可见)影响。