使用Format-Table

时间:2016-07-24 17:47:03

标签: powershell formatting formattable

我正试图从列表中获取某些PC的最后重启时间。当我使用

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

输出结果如下。

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 

这就是我得到的:

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. 中间有很多空白区域。

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

2 个答案:

答案 0 :(得分:15)

总结并补充PetSerAlAnsgar Wiechers提供的有用评论:

<强> TL;博士

Get-CimInstance -ClassName win32_operatingsystem -ComputerName $pclist |
  Sort-Object CSName |
    Format-Table CSName, LastBootUpTime -AutoSize

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

Get-CimInstance获取计算机名称的数组,因此不需要循环;但是,由于目标计算机并行查询 ,因此返回的对象的顺序通常匹配计算机名称的输入顺序 - 这已通过{{1}进行了纠正打电话。

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

其核心问题是如何控制表格输出的输出列宽,这适用于任何 cmdlet的输出。

使用Sort-Object CSName cmdlet(直接)表格输出, Format-Table Select-Object的目的是创建自定义对象,而不是格式化输出;如果此类对象(通常是没有预定义格式化视图的任何类型的实例)碰巧 4或更少的属性,则默认情况下它们在幕后用Select-Object格式化(但是你没有开始申请);否则,隐含使用Format-Table谢谢,PetSerAl

  • Format-List总是将输出行限制为可用的屏幕宽度 ,这意味着:

    • 可能根本无法打印列。
    • 打印的最后一列可能会截断其值,缺少的部分由Format-Table表示(但请注意所有打印的列 可能已截断值)。
  • 如果您想创建更长的行 ,请将...的输出传送到Format-Table| Out-File -Width <int>;请注意,如果您将后者打印到屏幕上,则行将换行(但额外的换行符不会成为数据的一部分)。

    • 警告:在 Windows PowerShell 上,请勿使用| Out-String -Stream -Width <int>,因为带有格式化数据的类型的表格格式数据无条件地正确填充空格到整个宽度,这会占用输出文件中过多的内存/空间,甚至可能会耗尽内存。在PowerShell Core 中,至少已经修复了v6.1。

    • Windows上的替代(在 Unix - 类平台上的PowerShell Core中不起作用)是使用-Width ([int]::MaxValue)来扩展屏幕缓冲区允许更长的行不包裹但需要水平滚动
      此外,在Windows上,它仅适用于常规控制台,而不适用于ISE。

  • 控制列宽 - 间接确定适合的列数 - 使用以下参数:

    • [console]::BufferWidth = <column-count> ...告诉-AutoSize根据需要调整列以适应所有数据值,但请注意,这会导致更少(更少)通常:更多)列显示。

    • Format-Table ...如果需要,打印 last 列的值跨越多行,以避免截断。

    • 指定自定义列宽 ,请将带有-Wrap属性的哈希表作为元素传递给{{ 1}}的{​​{1}}参数;例如,以下示例将第一个输出列限制为5个字符:
      Width
      如果发生截断,截断指示符Format-Table总是占用截断值的最后3个字符;在上面的示例中,-Property值呈现为[pscustomobject] @{ prop1='1234567890'; prop2='other' } | Format-Table -Property @{ e='prop1'; width = 5 }, prop2,总共有5个字符 此外,指定至少一个自定义宽度意味着您必须在...参数中显式枚举所有属性以输出,即使是那些不需要自定义的属性宽度。

答案 1 :(得分:4)

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

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

Column 1    Column 2      Column 3      Column 4
--------    --------      --------      --------
Data        Lorem ip...   Lorem ip...   Important data

这是基本的Format-Table语法,其中包含显式属性列表:

$data | Format-Table -Property Col1, Col2, Col3, Col4 -AutoSize

我们不仅可以传递属性名称,还可以添加一些additional metadata to the Property list

$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

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