默认情况下,PowerShell 的 Format-Table 使用单个空格字符作为列分隔符。 根据数据的不同,它可能会导致一些混乱。
是否有一种方法可以覆盖该行为(全局或根据具体情况),例如,用三个空格而不是一个空格分隔列?
这是一个小例子。 正如您所看到的,数据只是混合在一起。
$containers | Format-Table @{n='Id';e={$_.Id.Substring(0, 12)}}, Name, @{n='Created';e={$_.CreatedAtDisplay}}, Status, IPAddress, PID, Platform, @{n='Image';e={$_.ImageName}}, Command
Id Name Created Status IPAddress Pid Platform Image Command
-- ---- ------- ------ --------- --- -------- ----- -------
c311319af3c0 pwsh-nano-1 2021-12-11 15:25 Up 29 hours 192.168.99.43 27248 windows pwsh-nano "ping -t localhost"
c911d82df957 pwsh-2 2021-12-05 16:30 Up 3 days 192.168.99.235 5420 windows pwsh "ping -t localhost"
与下面的示例进行对比,其中我使用自定义 format.ps1xml,其中我将每列的宽度设置为比我设计的示例中的最长值长几个字符。 看看消费起来有多容易? 有些人可能喜欢压缩数据,并且喜欢每个人自己的数据,但出于本次讨论的目的,我们只关注所提出问题的解决方案。
$containers | Format-Table
Id Name Created Status IP Address PID Platform Image Command
-- ---- ------- ------ ---------- --- -------- ----- -------
c311319af3c0 pwsh-nano-1 2021-12-11 15:25 Up 29 hours 192.168.99.43 27248 windows pwsh-nano "ping -t localhost"
c911d82df957 pwsh-2 2021-12-05 16:30 Up 3 days 192.168.99.235 5420 windows pwsh "ping -t localhost"
虽然看起来更好,但这种方法无法扩展,当值相对较短时效率低下,并且当值长于定义的宽度时无法实现目标。 除非我遗漏了什么,否则明显的解决方案是 PowerShell 应该允许以某种方式覆盖列分隔符。 我希望这种行为已经存在,但我很怀疑,因为我的搜索没有产生任何结果,而我在这里......
有办法做到这一点吗? 如果没有,是否有任何可以提供此功能的 Format-Table 不错的替代方案?
如果您使用
Format-Table -Auto
,它会像您的示例一样删除列之间的填充。
如果您想要更多控制,我建议您查看
您可以在会话中实时尝试更改。它会为您写入并导入
format.ps1xml
。
您可以从这些命令开始。只需将参数更新为
Write-FormatView
,然后再次运行即可。
Write-FormatView -TypeName ([Text.Rune]) ...
| Out-FormatData | Push-FormatData
Import-module EzOut
Write-FormatView -TypeName ([Text.Rune]) -Property @(
'Render', 'Hex', 'Dec', 'Utf16', 'Utf8', 'Numeric' , 'Cat' , 'Ctrl' , 'Enc8', 'Enc16', 'Enc16Be', 'Upper', 'Lower'
) -AliasProperty @{
'Cat' = 'GetUnicodeCategory'
'Dec' = 'Value'
'Utf16' = 'Utf16SequenceLength'
'Utf8' = 'Utf8SequenceLength'
'Text' = 'Render'
'Lower' = 'ToLowerInvariant'
'Upper' = 'ToUpperInvariant'
'Symbol' = 'IsSymbol'
} -AlignProperty @{
'Enc8' = 'right'
'Enc16' = 'right'
'Enc16Be' = 'right'
'Rune' = 'right'
'Hex' = 'right'
} -VirtualProperty @{
Enc8 = {
[Text.Encoding]::GetEncoding('utf-8').GetBytes( $_ )
| Join-string -f '{0:x2}' -sep ' ' }
Enc16 = {
[Text.Encoding]::GetEncoding('utf-16le').GetBytes( $_ )
| Join-string -f '{0:x2}' -sep ' ' }
Enc16Be = {
[Text.Encoding]::GetEncoding('utf-16be').GetBytes( $_ )
| Join-string -f '{0:x2}' -sep ' ' }
Cat = { # Category
[Text.Rune]::GetUnicodeCategory( $_.Value )
}
Hex = {
Join-String -f '{0:x}' -sep ' ' -In $_.Value
}
Render = { $_ | Format-ControlChar }
Numeric = { [Text.Rune]::GetNumericValue( $_ ) } # was: 'GetNumericValue'
GetUnicodeCategory = { [Text.Rune]::GetUnicodeCategory( $_ ) }
'Lower' = # ToLowerInvariant =
{ [Text.Rune]::ToLowerInvariant( $_ ) }
'Upper' = # ToUpperInvariant
{ [Text.Rune]::ToUpperInvariant( $_ ) }
} -AutoSize
| Out-FormatData | Push-FormatData