PowerShell: Format-Table без заголовков - PullRequest
13 голосов
/ 15 июля 2010

В скрипте PowerShell у меня есть несколько объектов, которые я передаю в Format-Table CmdLet.
Вывод моего скрипта выглядит так:

Something...

Operation AttributeName  AttributeValue
--------- -------------  --------------
Delete    Member         John Doe

Something else...

Поскольку значения полей довольно понятны, я бы хотел удалить заголовки, разделители '---' и пустые строки в начале и в конце из выходных данных Format-Table.
Я не думаю, что CmdLet поддерживает это (или, по крайней мере, если есть параметр для этого, я не смог бы его найти).

Какой лучший способ оставить только строки с фактическими значениями из выходных данных Format-Table?

Ответы [ 6 ]

26 голосов
/ 15 июля 2010

Попробуйте параметр -HideTableHeaders для Format-Table:

gci | ft -HideTableHeaders

(я использую PowerShell v2. Я не знаю, был ли это в v1.)

7 голосов
/ 03 января 2017

Попробуйте -ExpandProperty.Например, я использую это для отправки чистой переменной в Out-Gridview -PassThru, в противном случае в переменной хранится информация заголовка.Обратите внимание, что это не очень хорошо, если вы хотите вернуть более одного свойства.

Пример:

Get-ADUser -filter * | select name -expandproperty name

В качестве альтернативы вы можете сделать это:

(Get-ADUser -filter * ).name
7 голосов
/ 15 июля 2010

Параметр -HideTableHeaders, к сожалению, по-прежнему вызывает печать пустых строк (и заголовки таблиц, по-видимому, по-прежнему учитываются для ширины столбца). Единственный способ, с помощью которого я могу надежно работать, - это самостоятельно отформатировать вывод:

| % { '{0,10} {1,20} {2,20}' -f $_.Operation,$_.AttributeName,$_.AttributeValue }
3 голосов
/ 23 октября 2017

Вот как я это решаю.Я просто перенаправляю вывод в Out-String, а затем передаю этот вывод в функцию .NET Trim:

(gci | ft -HideTableHeaders | Out-String).Trim()

Это удалит разрывы строк до и после таблицы.

Youможно также использовать TrimStart, чтобы просто позаботиться о разрыве строки заголовка, если вы по-прежнему хотите разрывы конечной строки.

(gci | ft -HideTableHeaders | Out-String).TrimStart()
1 голос
/ 29 мая 2013

Другой подход заключается в использовании ForEach-Object для проецирования отдельных элементов в строку, а затем в Out-String CmdLet для проецирования окончательных результатов в строку или массив строк:

gci Microsoft.PowerShell.Core\Registry::HKEY_CLASSES_ROOT\CID | foreach { "CID Key {0}" -f $_.Name } | Out-String

#Result: One multi-line string equal to:
@"
CID Key HKEY_CLASSES_ROOT\CID\2a621c8a-7d4b-4d7b-ad60-a957fd70b0d0
CID Key HKEY_CLASSES_ROOT\CID\2ec6f5b2-8cdc-461e-9157-ffa84c11ba7d
CID Key HKEY_CLASSES_ROOT\CID\5da2ceaf-bc35-46e0-aabd-bd826023359b
CID Key HKEY_CLASSES_ROOT\CID\d13ad82e-d4fb-495f-9b78-01d2946e6426
"@

gci Microsoft.PowerShell.Core\Registry::HKEY_CLASSES_ROOT\CID | foreach { "CID Key {0}" -f $_.Name } | Out-String -Stream

#Result: An array of single line strings equal to:
@(
"CID Key HKEY_CLASSES_ROOT\CID\2a621c8a-7d4b-4d7b-ad60-a957fd70b0d0",
"CID Key HKEY_CLASSES_ROOT\CID\2ec6f5b2-8cdc-461e-9157-ffa84c11ba7d",
"CID Key HKEY_CLASSES_ROOT\CID\5da2ceaf-bc35-46e0-aabd-bd826023359b",
"CID Key HKEY_CLASSES_ROOT\CID\d13ad82e-d4fb-495f-9b78-01d2946e6426")

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

0 голосов
/ 06 ноября 2012

Я знаю, что прошло 2 года, но эти ответы помогли мне сформулировать функцию фильтра для вывода объектов и обрезки результирующих строк. Поскольку я должен отформатировать все в строку в своем окончательном решении, я пошел по-другому. Длинная рука, моя проблема очень похожа, и выглядит примерно так

$verbosepreference="Continue"
write-verbose (ls | ft | out-string) # this generated too many blank lines

Вот мой пример:

ls | Out-Verbose # out-verbose formats the (pipelined) object(s) and then trims blanks

Моя функция Out-Verbose выглядит следующим образом:

filter Out-Verbose{
Param([parameter(valuefrompipeline=$true)][PSObject[]]$InputObject,
      [scriptblock]$script={write-verbose "$_"})
  Begin {
    $val=@()
  }
  Process {
    $val += $inputobject
  }
  End {
    $val | ft -autosize -wrap|out-string |%{$_.split("`r`n")} |?{$_.length} |%{$script.Invoke()}
  }
}

Примечание 1: Это решение не будет масштабироваться до миллионов объектов (оно не обрабатывает конвейер последовательно)

Примечание 2: Вы все еще можете добавить опцию -noheaddings. Если вам интересно, почему я использовал здесь скрипт-блок, это позволяет перегрузке, например, отправлять на диск-файл или в другие потоки вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...