2010-07-15 3 views
8

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

Something... 

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

Something else... 

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

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

ответ

19

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

gci | ft -HideTableHeaders 

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

+0

полностью пропустил параметр :( Спасибо! –

+1

New-Alias ​​RTFM Get-Help # :) – JasonMArcher

+1

Да, это делает работу v1 спасибо! – tommed

4

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

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

Я знаю, что это 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-Многословный функция выглядит следующим образом:

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

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

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

1

Другой подход заключается в использовании 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") 

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

1

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

Пример:

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

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

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

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

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

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

Что такое gci? Я 'somecode | где blah -eq 'test'} | выберите textcontent' – user206168