PowerShell: Format-таблица без заголовков

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

Something...

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

Something else...

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

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

6 ответов


попробовать до Format-Table:

gci | ft -HideTableHeaders

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


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

| % { '{0,10} {1,20} {2,20}' -f $_.Operation,$_.AttributeName,$_.AttributeValue }

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

пример:

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

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

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\CIDa621c8a-7d4b-4d7b-ad60-a957fd70b0d0
CID Key HKEY_CLASSES_ROOT\CIDec6f5b2-8cdc-461e-9157-ffa84c11ba7d
CID Key HKEY_CLASSES_ROOT\CIDda2ceaf-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\CIDa621c8a-7d4b-4d7b-ad60-a957fd70b0d0",
"CID Key HKEY_CLASSES_ROOT\CIDec6f5b2-8cdc-461e-9157-ffa84c11ba7d",
"CID Key HKEY_CLASSES_ROOT\CIDda2ceaf-bc35-46e0-aabd-bd826023359b",
"CID Key HKEY_CLASSES_ROOT\CID\d13ad82e-d4fb-495f-9b78-01d2946e6426")

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


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

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

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

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

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

Я знаю, что это на 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()}
  }
}

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

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