Powershell: Sortowanie wg kilku właściwości w różnej kolejności

7-paź-2016

Znasz pewnie polecenie Sort-Object, które pozwala sortować obiekty np. w ten sposób:

Get-Service B* | Select Name, StartType, Status | Sort StartType,Status

Oto wynik:

sort01
Jak widać porządek nie zawsze jest intuicyjny w takim sortowaniu. Gdzieś „pod spodem” Status Running lub Stopped oznaczony jest prawdopodobnie liczbowo i dlatego w ramach usług z typem uruchomienia Manual widać najpierw usługi zatrzymane a dopiero potem uruchomione. Jeśli chcesz odwrócić porządek sortowania możesz zastosować opcję -Descending, o tak:

Get-Service B* | Select Name, StartType, Status | Sort StartType,Status -Descending

Oto wynik:

sort02

 

Znowu nie jest idealnie, bo teraz obie kolumny są uporządkowane w kolejności malejącej. Najpierw widać usługi wyłączone, potem w trybie manualnym i na końcu te, które startują automatycznie. Co zrobić? RTFM: https://technet.microsoft.com/en-us/library/hh849912.aspx

Zobaczmy rozwiązanie. Przekazywanie nazw kolumn podczas sortowania to pewne uproszczenie. W tym miejscu może się znaleźć lista obiektów, które powinny posiadać dwie właściwości: Expression (w skrócie e) oraz conajmniej jedną z dwóch: Ascending (skrót A) lub Descending (skrót D). Zacznijmy od zdefiniowania takich zmiennych a dokładniej hash table z takimi właściwościami:

$sort1 = @{e='StartType';Ascending=$true}
$sort2 = @{e='Status';Descending=$true}

Zmienna $sort1 mówi – sortujemy po StartType w kolejności Ascending (rosnąco)

Zmienna $sort2 mówi – sortujemy po Status w kolejności Descending (malejąco).

Pozostaje teraz posortować dane korzystając z tych zmiennych:

Get-Service B* | Select Name, StartType, Status | Sort $sort1,$sort2

Oto wynik:

sort04 Rzeczywiście: Decydujący wpływ na sortowanie ma kolumna StartType, gdzie najpierw widzimy usługi startujące automatycznie, potem ręcznie i wreszczie wyłączone. Jeśli skupimy się teraz na kolumnie status i przyjrzymy się tylko usługom startowanym manualnie, to widać że najpierw widać usługi uruchomione a potem zatrzymane.

Oto wycinek z helpa opisujący właśnie te parametry:

-Property<Object[]>

Specifies the properties to use when sorting. Objects are sorted based on the values of these properties. Enter the names of the properties. Wildcards are permitted.

If you specify multiple properties, the objects are first sorted by the first property. If more than one object has the same value for the first property, those objects are sorted by the second property. This process continues until there are no more specified properties or no groups of objects.

If you do not specify properties, the cmdlet sorts based on default properties for the object type.

The value of the Property parameter can be a calculated property. To create a calculated, property, use a hash table. Valid keys are:

— Expression <string> or <script block>
— Ascending <Boolean>
— Descending <Boolean>

 

 

 

 

 

 

 

 

Komentarze są wyłączone

Autor: Rafał Kraik