Format-List: сортировка свойств по имени - PullRequest
8 голосов
/ 19 июля 2010

Можно ли отсортировать выходные данные командлета Format-List по имени свойства?
Предположим, у меня есть объект $ x с двумя свойствами "A" и "B", и когда я запускаю Format-List сэто я получаю

(PS) > $x | Format-List
B : value b
A : value a

Я хотел бы иметь

(PS) > $x | Format-List 
A : value a
B : value b

ПРИМЕЧАНИЕ : я должен был указать с самого начала, что, в отличие от примера с "AСвойства "и" B ", реальный объект, с которым мне приходится иметь дело, имеет довольно много свойств, и в будущем могут быть добавлены новые, поэтому я не знаю всех имен свойств заранее.

Ответы [ 7 ]

10 голосов
/ 19 июля 2010

AFAIK, Format-List не предоставляет такой опции.

Для вашего конкретного примера это должно работать:

$x | Select-Object A, B | Format-List

Если набор свойств не является фиксированным / известным, тогда процедура будет более сложной с использованием Get-Member и некоторой предварительной обработкой, создающей отсортированный массив параметров для Select-Object.

EDIT:

Вот оно (давайте используем $ host вместо $ x):

$host | Select-Object ([string[]]($host | Get-Member -MemberType Property | %{ $_.Name } | Sort-Object)) | Format-List

Кристофер прав, Select-Object абсолютно не нужен:

$host | Format-List ([string[]]($host | Get-Member -MemberType Property | %{ $_.Name } | Sort-Object))
3 голосов
/ 19 июля 2010

Самое близкое, что я могу придумать, - это создать новый псобъект на основе старого, но с отсортированными свойствами, например ::10000

$x | %{$obj = new-object psobject; `
       $_.psobject.properties | Sort Name | `
           %{Add-Member -Inp $obj NoteProperty $_.Name $_.Value}; $obj} | fl

Можно придумать и дать новому псобъекту имя типа, совпадающее со старым и т. Д.

2 голосов
/ 16 мая 2014

Расширение идеи Кристофера с использованием get-member и format-list -Property:

$x | fl -property ($x| gm | sort name).name
1 голос
/ 19 июля 2010

Кажется, это работает нормально (отредактировано так, что принимает входные данные конвейера):

function Format-SortedList
{
    param (
        [Parameter(ValueFromPipeline = $true)]
        [Object]$InputObject,
        [Parameter(Mandatory = $false)]
        [Switch]$Descending
    )

    process
    {
        $properties = $InputObject | Get-Member -MemberType Properties

        if ($Descending) {
            $properties = $properties | Sort-Object -Property Name -Descending
        }

        $longestName = 0
        $longestValue = 0

        $properties | ForEach-Object {
            if ($_.Name.Length -gt $longestName) {
                $longestName = $_.Name.Length
            }

            if ($InputObject."$($_.Name)".ToString().Length -gt $longestValue) {
                $longestValue = $InputObject."$($_.Name)".ToString().Length * -1
            }
        }

        Write-Host ([Environment]::NewLine)

        $properties | ForEach-Object { 
            Write-Host ("{0,$longestName} : {1,$longestValue}" -f $_.Name, $InputObject."$($_.Name)".ToString())
        }
    }
}

$Host, $MyInvocation | Format-SortedList
$Host, $MyInvocation | Format-SortedList -Descending
1 голос
/ 19 июля 2010

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

Вот пример:

Format-List -Property Owner, Path

Если у вас много свойств, я не уверен, что существует какой-либо простой способ их сортировки в Format-List, как сказал Роман.

0 голосов
/ 19 июня 2019

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

... | Format-List | Out-String -Stream | Sort-Object

... который выполняет сортировку в каждой строке вывода Format-List.

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

... | Format-List | Out-String -Stream -Width ([Int32]::MaxValue) | Sort-Object

... за счет отступа от столбца.

Конечно, вся информация об объекте / конвейере теряется этим вызовом Out-String, хотя - учитывая, что то же самое верно для Format-List- вы, вероятно, не будете заботиться об этом.

0 голосов
/ 19 июля 2010

Я уверен, что вы можете достичь желаемого результата. Я предлагаю вам поэкспериментировать как с Sort-Object (или простой Sort), так и с Group-Object (plain Group)

Моя идея - разместить сортировку или группу перед | Формат-лист

Таким образом, $ x | sort-object -property xyz | Формат-список

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