Управление шириной столбцов с помощью Format-Table

Я пытаюсь получить время последней перезагрузки некоторых компьютеров из списка. Когда я использую

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

Выход приходит следующим образом.

csname lastbootuptime
------ --------------
CONFA7-L1-1A 15.07.2016 9:55:16
CONFA7-L1-1F 31.05.2016 8:51:46
CONFA7-L1-1G 18.06.2016 11:09:15
CONFA7-L1... 26.06.2016 17:31:31
CONFA7-L3... 24.07.2016 15:48:43

Который является опрятным, но если имя ПК длинное, я не могу видеть полное имя. Так что я конвейер Format-Table:

Get-CimInstance -ClassName win32_operatingsystem -ComputerName $pc |
  select csname, lastbootuptime |
  Format-Table  -HideTableHeaders 

И вот что я получаю:

CONFA7-L1-1A 15.07.2016 9:55:16



CONFA7-L1-1E 21.07.2016 12:58:16



CONFA7-L1-1F 31.05.2016 8:51:46

Здесь есть две проблемы.

  1. Там нет заголовка. Если я удалю -HideTableHeaders там будет заголовок для каждого выхода, который не требуется.

  2. Между ними много пробелов.

По сути, мне просто нужно получить вывод, похожий на первый, но без усечения полных имен. Как я могу это исправить?

2 ответа

Решение

Подводя итог и дополняя полезные комментарии, сделанные PetSerAl и Ansgar Wiechers:

ТЛ; др

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

-AutoSizeэто то, что гарантирует, что CSName (имя компьютера) настолько широк, насколько это необходимо для отображения всех значений в полном объеме.

Get-CimInstance принимает массив имен компьютеров, поэтому цикл не нужен; однако, поскольку целевые компьютеры запрашиваются параллельно, порядок возвращаемых объектов обычно не будет соответствовать порядку ввода имен компьютеров - это исправляется с помощьюSort-Object CSNameвызов.

Читайте дальше, чтобы узнатьбольше о форматировании таблицы.


По сути, ваш вопрос состоит в том, как управлять шириной выходного столбца табличного вывода, которая применяется к выводулюбого командлета.

Использовать Format-TableКомандлет (напрямую) для табличного вывода, а не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)потому что данные в формате таблицы для типов с данными форматирования безоговорочно дополняются пробелами до полной ширины, что может занимать чрезмерное количество памяти / пространства в выходном файле, и вы можете даже исчерпать память. В PowerShellCore это было исправлено, по крайней мере, с v6.1.

    • Альтернативой в Windows(не работает в PowerShell Core на Unix- подобных платформах) является использование[console]::BufferWidth = <column-count> расширить экранный буфер, чтобы позволить более длинные строки, которые не переносятся, но требуютгоризонтальной прокрутки.
      Кроме того, на Windows это работает только в обычной консоли, а не в ISE.

  • Дляуправленияшириной столбцов, которая косвенно определяет, сколько столбцов будет соответствовать, используйте следующие параметры:

    • -AutoSize... рассказывает Format-Table сделать столбцы настолько широкими, насколько это необходимо, чтобы соответствовать всем значениям данных, но учтите, что это может привести к тому, что будет отображаться меньше (реже: больше) столбцов.

    • -Wrap... заставляет значенияпоследнего напечатанного столбца занимать несколько строк, если необходимо, чтобы избежать усечения.

    • Чтобыуказатьнастраиваемую ширину столбца, передайтехеш-таблицу сWidthсвойство как элемент Format-Table"s -Property параметр; например, следующий пример ограничивает первый выходной столбец 5 символами:
      [pscustomobject] @{ prop1='1234567890'; prop2='other' } | Format-Table -Property @{ e='prop1'; width = 5 }, prop2
      Если происходит усечение, индикатор усечения ... неизменно занимает последние 3 символа усеченного значения; в приведенном выше примере prop1 значение отображается как 12... в общей сложности 5 символов.
      Кроме того, указание хотя бы раз настраиваемой ширины означает, что вы должны явно перечислить все свойства для вывода в -Property аргумент, даже те, которые не нуждаются в пользовательских ширинах.

Если вы хотите обрезать данные за определенную длину и вручную указать ширину столбцов, вы можете передать 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

Вместо того, чтобы просто передавать имена свойств, мы можем добавить некоторые дополнительные метаданные к 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

Примечание: я понимаю, что это рассматривается в нижней части более полного ответа mklement0, но если это ваш вариант использования и вы быстро прокручиваете, я надеюсь, что это поможет выделить эту стратегию на высоком уровне

Другие вопросы по тегам