如何将PowerShell的PSObject格式化为每行一个属性的表格?
问题描述
我创建了一个简单的PSObject:
$obj = New-Object -TypeName psobject $obj | Add-Member -MemberType NoteProperty -Name A -Value 'x' $obj | Add-Member -MemberType NoteProperty -Name B -Value 'y'
直接输入$obj或者执行Write-Host ($obj | Out-String),输出是列式表格:
A B - - x y
但我需要每行一个属性的格式,也就是:
A : x B : y
有资料说会自动输出这种格式,但实际不是这样,请问哪里操作错了?
补充说明:当属性值较长时,默认的表格格式可读性很差,示例如下:
> $obj = New-Object -TypeName psobject > $obj | Add-Member -MemberType NoteProperty -Name A -Value 'https://abcdef/ghijkl/mnopqr/stuvwx?y=z' > $obj | Add-Member -MemberType NoteProperty -Name B -Value 'https://abcdef/ghijkl/mnopqr/stuvwx?y=z' > $obj A B - - https://abcdef/ghijkl/mnopqr/stuvwx?y=z https://abcdef/ghijkl/mnopqr/stuvwx?y=z
解决方案
PowerShell的默认格式化规则是根据对象的属性数量、属性值长度自动选择输出样式:当对象属性数量较少(通常≤4个)且值较短时,默认用表格格式输出;只有当属性数量多,或者属性值长度超过控制台宽度阈值时,才会自动切换为列表格式。你的场景里,即使属性值较长,但两个属性的总宽度还没触发自动切换的阈值,所以依然是表格格式。
要强制输出每行一个属性的列表格式,直接使用Format-List命令(可缩写为fl):
方法1:直接管道输出到Format-List
$obj | Format-List
输出结果:
A : x B : y
对于长值的场景:
$obj | Format-List
输出结果:
A : https://abcdef/ghijkl/mnopqr/stuvwx?y=z B : https://abcdef/ghijkl/mnopqr/stuvwx?y=z
方法2:结合Out-String使用(如果需要转成字符串)
如果要像之前的Write-Host ($obj | Out-String)那样转成字符串输出,只需改成:
Write-Host ($obj | Format-List | Out-String)
日常使用中直接用Format-List是最简便的方式,若需让这类对象默认以列表格式输出,可创建自定义格式文件,但一般没必要。
内容的提问来源于stack exchange,提问作者F-H
相关产品推荐
相关产品推荐

