Управление шириной столбцов с помощью 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
Здесь есть две проблемы.
Там нет заголовка. Если я удалю
-HideTableHeaders
там будет заголовок для каждого выхода, который не требуется.Между ними много пробелов.
По сути, мне просто нужно получить вывод, похожий на первый, но без усечения полных имен. Как я могу это исправить?
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, но если это ваш вариант использования и вы быстро прокручиваете, я надеюсь, что это поможет выделить эту стратегию на высоком уровне