Group-Object

Grupuje obiekty o tej samej wartości właściwości.

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: | Group-Object [-Property]

  • -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 kolumny Count i Name. 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ślnie ERROR i error trafiają 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 grupy Running i Stopped wraz 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.