powershell - 使用格式表控制列宽

我正在尝试从列表中获取某些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

Which is neat, but if the PC name is long, I am unable to see the full name. So I pipelined 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 2016/7/21下午12:58:16

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

这里有两个问题。
  • 没有标题。如果我删除-HideTableHeaders,那么每个输出的标题都是不必要的。
  • 之间有很多空格。

  • 基本上,我只需要获得与第一个输出相似的输出,但不截断全名。我该如何解决?

    最佳答案

    总结和补充PetSerAl和Ansgar Wiechers的有用评论:
    tl;博士

    Get-CimInstance -ClassName win32_operatingsystem -ComputerName $pclist |
      Sort-Object CSName |
        Format-Table CSName, LastBootUpTime -AutoSize
    
    -AutoSize是确保CSName(计算机名称)列与一样宽的功能,以便完整显示所有值。Get-CimInstance采用计算机名称数组,因此不需要循环。但是,由于并行查询目标计算机,因此返回的对象顺序通常将与计算机名称的输入顺序不匹配-这可以通过Sort-Object CSName调用来纠正。
    控制各个列的宽度:
    # Instead of a simple property name, 'prop1', pass a *hashtable*
    # (@{ ... }`) with a 'width' entry to Format-Table
    PS> [pscustomobject] @{ prop1='1234567890'; prop2='other' } |
           Format-Table -Property @{ e='prop1'; width = 5 }, prop2
    
    prop1 prop2
    ----- -----
    1234… other
    
    注意:在Windows PowerShell中,您只会看到12...作为截断值,因为它使用3个单独的.字符来表示截断。在PowerShell [Core] 6+中,此功能已改进为使用单个字符(水平椭圆, U+2026 )。
    继续阅读以了解有关表格式的更多信息。

    从根本上讲,您的问题是关于如何控制表格输出的输出列宽度,该格式适用于任何cmdlet的输出。
    (直接)使用Format-Table cmdlet进行表格输出,而不是Select-Object :Select-Object的目的是创建自定义对象,而不是设置输出格式。如果此类对象(通常是没有预定义格式 View 的任何类型的实例)碰巧具有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中不起作用),Windows上的另一种选择是使用[console]::BufferWidth = <column-count>扩大屏幕缓冲区,以允许较长的行不换行,但需要水平滚动。
    此外,在Windows上,它只能在常规控制台中使用,而不能在ISE中使用。

  • 控制列的宽度-间接确定要容纳多少列-使用以下参数:
  • -AutoSize ...告诉Format-Table根据需要使列尽可能宽以适合所有数据值,但是请注意,这可能会导致显示更少(通常更少:更多)的列。
  • -Wrap ...如果需要,使打印的最后一列的值跨多行,以避免被截断。
  • 指定自定义列宽,传递一个哈希表,并将Width属性作为参数-calculated property称为Format-Table-Property参数;例如,以下示例将第一个输出列限制为5个字符:
      [pscustomobject] @{ prop1='1234567890'; prop2='other' } |
        Format-Table -Property @{ e='prop1'; width = 5 }, prop2
    
  • 如果发生截断(默认情况下应用于值的末尾),则截断指示器... / 始终占据截断值的后3个字符(在Windows PowerShell中)/仅占最后一个字符(在PowerShell [Core] 6中) +);在上面的示例中,prop1值呈现为12... / 1234…,总共5个字符。
  • 要截断值的开头,必须使用alignment = 'right'条目将列更改为右对齐(默认为'left''center'是第三个选项;这两个截断值的末尾)。
  • 如果要保留左对齐,同时仍在值的开头被截断,则必须在分配给{ ... }(e)条目的脚本块(expression)中使用自定义表达式:
    [pscustomobject] @{ prop1='1234567890'; prop2='other' } |
      Format-Table -Property @{ 
          n='prop1'; e={ $_.prop1 -replace '^.+(.{4})$', '…$1'}; width = 5 
        }, prop2
    
  • 注意:指定至少一个自定义宽度意味着您必须显式枚举所有属性,以便在-Property参数中输出,即使是不需要自定义宽度的属性。


  • https://stackoverflow.com/questions/38554966/

    相关文章:

    c# - 使用对象初始化器时修复缩进

    c# - 大写的UTF-8?

    php - 格式化 MySQL 查询的结果,就好像它是从控制台运行的一样

    python - 我应该如何在 python 中缩进三元条件运算符以使其符合 PEP8?

    layout - Mathematica 中的 2 列文档

    r - xtable 用于条件单元格格式化表格的重要 p 值

    python - 在 OSX 上使用格式语言的德语数字分隔符?

    python - 如何使用 .format() 打印字符串,并在替换的字符串周围打印文字花括号

    formatting - 我可以在 specflow 中更改 Gherkin 格式样式吗?

    css - 无法使用 class=pull-right 或 float :right 向右浮动 tw