格式-表格分隔符

问题描述 投票:0回答:1

默认情况下,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 不错的替代方案?

powershell format tabular powershell-cmdlet powershell-core
1个回答
0
投票

如果您使用

Format-Table -Auto
,它会像您的示例一样删除列之间的填充。

如果您想要更多控制,我建议您查看

您可以在会话中实时尝试更改。它会为您写入并导入

format.ps1xml

enter image description here

您可以从这些命令开始。只需将参数更新为

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
© www.soinside.com 2019 - 2024. All rights reserved.