Group-Object (alias group) to cmdlet PowerShella, który grupuje obiekty z potoku według wartości wybranej właściwości. Zamiast ręcznie liczyć, ile masz procesów danego typu, plików danego rozszerzenia albo usług w danym stanie, wpychasz dane do Group-Object, a on zwraca paczki obiektów z identyczną wartością wraz z licznikiem. To podstawowe narzędzie do robienia zestawień i statystyk w terminalu Windows, bardzo podobne w działaniu do GROUP BY z SQL-a.
Składnia i najważniejsze opcje
Podstawowa składnia:
-Property— właściwość (lub kilka), po której grupujesz; możesz podać też wyrażenie skryptowe w nawiasach klamrowych.-NoElement— pomija listę obiektów w grupie, zostawia tylko kolumnyCountiName. Idealne do czystych zestawień.-AsHashTable— zwraca wynik jako tablicę haszującą: klucz to wartość właściwości, wartość to obiekty z tej grupy. Wygodne do szybkiego lookupu.-AsString— wymusza, by klucze tablicy haszującej były napisami; działa tylko razem z-AsHashTable.-CaseSensitive— grupuje z rozróżnianiem wielkości liter (domyślnieERRORierrortrafiają do jednej grupy).-Culture— ustawia kulturę używaną przy porównywaniu napisów.-InputObject— pozwala podać obiekty wprost zamiast przez potok (rzadziej używane).
Przykłady użycia
Get-Process | Group-Object -Property ProcessName -NoElement— pokazuje, ile masz instancji każdego procesu (świetne do polowania na 30 kart przeglądarki).Get-ChildItem -File | Group-Object Extension -NoElement— liczy pliki w katalogu według rozszerzenia.Get-Service | Group-Object Status— dzieli usługi na grupyRunningiStoppedwraz z ich listą.Get-ChildItem -File | Group-Object { $_.LastWriteTime.ToString('yyyy-MM') }— grupuje pliki po miesiącu ostatniej modyfikacji, używając wyrażenia obliczanego.$svc = Get-Service | Group-Object Status -AsHashTable; $svc['Running']— buduje tablicę haszującą i od razu wyciąga uruchomione usługi.
Częste błędy i pułapki
Najczęstsza wpadka to literówka w nazwie właściwości — Group-Object nie zgłosi błędu, tylko wrzuci wszystko do jednej grupy z pustą nazwą, bo każdy obiekt ma w niej $null. Zerknij wcześniej na Get-Member, żeby znać prawdziwe nazwy pól. Pamiętaj też, że domyślnie grupowanie ignoruje wielkość liter — jeśli zależy Ci na rozróżnieniu, dodaj -CaseSensitive. Przy -AsHashTable bez -AsString kluczami bywają całe obiekty, a nie napisy, co potrafi popsuć odwołania w stylu $h['tekst']; połączenie -CaseSensitive z -AsHashTable działa dopiero od PowerShella 7. Na koniec drobiazg wydajnościowy: jeśli potrzebujesz tylko liczb, dawaj -NoElement, bo bez tego PowerShell trzyma w pamięci wszystkie obiekty każdej grupy.
Powiązane komendy: Sort-Object, Measure-Object, Where-Object, Select-Object, ForEach-Object, Get-Member.