使用Format-Table控制列宽

scr*_*ver 13 powershell formatting formattable

我试图从列表中获取一些PC的最后重启时间.我用的时候

foreach ($pc in $pclist) {
  Get-CimInstance -ClassName win32_operatingsystem -ComputerName $pc |
    select csname, lastbootuptime 
}
Run Code Online (Sandbox Code Playgroud)

输出如下.

csname       lastbootuptime
------       --------------
CONFA7-L1-1A 7/15/2016 9:55:16 AM
CONFA7-L1-1F 5/31/2016 8:51:46 AM
CONFA7-L1-1G 6/18/2016 11:09:15 AM
CONFA7-L1... 6/26/2016 5:31:31 PM
CONFA7-L3... 7/24/2016 3:48:43 PM

哪个很整洁,但如果PC名称很长,我无法看到全名.所以我流水线Format-Table:

Get-CimInstance -ClassName win32_operatingsystem -ComputerName $pc |
  select csname, lastbootuptime |
  Format-Table  -HideTableHeaders 
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

CONFA7-L1-1A 7/15/2016 9:55:16 AM



CONFA7-L1-1E 7/21/2016 12:58:16 PM



CONFA7-L1-1F 5/31/2016 8:51:46 AM

这里有两个问题.

  1. 没有标题.如果我删除-HideTableHeaders将有标题为每个输出不需要.

  2. 中间有很多空白区域.

基本上我只需要获得类似于第一个的输出,但不要截断全名.我该如何解决这些问题?

mkl*_*nt0 21

总结和补充PetSerAlAnsgar Wiechers的有用评论:

TL;博士

Get-CimInstance -ClassName win32_operatingsystem -ComputerName $pclist |
  Sort-Object CSName |
    Format-Table CSName, LastBootUpTime -AutoSize
Run Code Online (Sandbox Code Playgroud)

-AutoSize确保CSName(计算机名称)列的宽度足以确保完整显示所有值.

Get-CimInstance获取一系列计算机名称,因此不需要循环; 但是,由于目标计算机是并行查询,因此返回的对象的顺序通常与计算机名称的输入顺序匹配 - 这可以通过Sort-Object CSName调用来纠正.

继续阅读以了解有关表格格式的更多信息


从本质上讲,您的问题是如何控制表格输出的输出列宽,这适用于任何 cmdlet的输出.

使用Format-Tablecmdlet(直接)表格输出,而不是 Select-Object:目的Select-Object是创建自定义对象,而不是格式化输出; 如果这些对象(通常是没有预定义格式化视图的任何类型的实例)恰好具有4个或更少的属性,则默认情况下它们是Format-Table在幕后格式化的(但是您不能应用选项); 否则,这Format-List是隐含使用的.谢谢,PetSerAl.

  • Format-Table总是将输出线限制在可用的屏幕宽度,这意味着:

    • 列可能根本不打印.
    • 打印的最后一列可能会截断其值,缺少的部分由...(尽管请注意所有打印的列都可以具有截断值).
  • 如果你想创建更长的线,管道Format-Table的输出到| Out-File -Width <int>| Out-String -Stream -Width <int>; 请注意,如果您将后者打印到屏幕上,则会行(但额外的换行符不会成为数据的一部分).

    • 警告:在Windows PowerShell上,请勿使用-Width ([int]::MaxValue),因为具有格式化数据的类型的表格式数据无条件地用空格填充整个宽度,这会占用输出文件中过多的内存/空间,甚至可能会运行内存不足.在PowerShell Core中,至少已经修复了v6.1.

    • Windows上的替代方案(在类似Unix的平台上的PowerShell Core中不起作用)是用于[console]::BufferWidth = <column-count>扩展屏幕缓冲区以允许更长的行不包装,但需要水平滚动.
      此外,在Windows上,它仅适用于常规控制台,而不适用于ISE.

  • 控制列宽(间接确定适合的列数),请使用以下参数:

    • -AutoSize...告诉Format-Table要使列尽可能宽以适合所有数据值,但请注意,这可以导致显示更少(更少通常:更多)列.

    • -Wrap... 如果需要,使打印的最后一列的值跨越多行,以避免截断.

    • 指定的自定义列的宽度,通过一个具有散列表Width属性作为一个元素Format-Table-Property参数; 例如,以下示例将第一个输出列限制为5个字符:
      [pscustomobject] @{ prop1='1234567890'; prop2='other' } | Format-Table -Property @{ e='prop1'; width = 5 }, prop2
      如果发生截断,截断指示符...总是占用截断值的最后3个字符; 在上面的示例中,prop1值呈现12...总共5个字符.
      此外,指定至少一个自定义的宽度意味着你必须明确地列举所有属性输出-Property参数,甚至不需要自定义的宽度的人.


Kyl*_*Mit 9

如果希望修剪数据超过一定长度并手动指定列宽,则可Width以为每个属性属性传递一个属性。

例如,如果您希望数据看起来像这样:

Column 1    Column 2      Column 3      Column 4
--------    --------      --------      --------
Data        Lorem ip...   Lorem ip...   Important data
Run Code Online (Sandbox Code Playgroud)

这是基本Format-Table语法,带有一系列显式属性:

$data | Format-Table -Property Col1, Col2, Col3, Col4 -AutoSize
Run Code Online (Sandbox Code Playgroud)

我们不仅可以传递属性名称,还可以向中添加一些其他元数据Property

$a = @{Expression={$_.Col1}; Label="Column 1"; Width=30}, 
     @{Expression={$_.Col2}; Label="Column 2"; Width=30}, 
     @{Expression={$_.Col3}; Label="Column 3"; Width=30}, 
     @{Expression={$_.Col4}; Label="Column 4"; Width=30}
$data | Format-Table -Property $a
Run Code Online (Sandbox Code Playgroud)

注意:我知道这已经涵盖在mklement0的更完整答案的底部,但是,如果这是您的用例,并且您在快速滚动,那么我希望这有助于从总体上突出此策略。

  • 考虑到问题的标题,让这些信息更容易被发现是非常有意义的;此后,我也将这项技术添加到我的答案的顶部,但您的答案仍然提供了一些额外的内容:它展示了如何使用计算的属性哈希表来_重命名_输出列。 (4认同)
  • 我将一台机器升级到Powershell 5.1,突然之间,我的专栏在电子邮件报告中没有对齐。在哈希表中添加您的`Width = x`参数重新对齐了所有内容。 (2认同)