Cześć, witaj w kolejnym wpisie z cyklu PowerShell Podstawy. Po zrozumieniu logiki obiektowej nadszedł czas, aby zastosować ją w praktyce na nieco większą skalę. Dziś skupimy się na filtrowaniu, sortowaniu oraz wybieraniu konkretnych właściwości z danych, w skrócie – praktyczne operacje na obiektach.
Pracując w PowerShellu szybko zauważysz, że dane mogą pochodzić z bardzo różnych źródeł. Mogą to być dane użytkowników, informacje o plikach, procesach czy usługach. I równie szybko przekonasz się, że tych danych często jest po prostu za dużo. Surowe wyniki bywają chaotyczne, nieuporządkowane i trudne w bezpośredniej interpretacji i wykorzystaniu. Aby wydobyć z nich to, co najważniejsze, potrzebujesz trzech podstawowych narzędzi:
- filtrowania – dzięki temu zawęzisz wyniki do tych, które naprawdę Cię interesują
- sortowania – nadasz danym przejrzystą strukturę by ułatwić analizę
- wybierania właściwości – skupisz się wyłącznie na kluczowych informacjach
Te trzy operacje to fundament pracy z danymi w PowerShellu. Dzięki nim nie tylko oszczędzisz czas, ale też stworzysz bardziej przejrzyste i użyteczne skrypty, które będą działały dokładnie tak, jak tego potrzebujesz. Przejdźmy krok po kroku przez każdy z tych elementów, ucząc się na praktycznych przykładach.
Filtrowanie danych — Where-Object
Filtrowanie polega na wybieraniu obiektów z kolekcji, które spełniają określone warunki. PowerShell oferuje różne techniki filtrowania. Jedną z najczęściej używanych jest zastosowanie cmdletu Where-Object
. Umożliwia on pracę z dowolnym zbiorem obiektów i zwraca tylko te, które spełniają określone warunki. Dzięki operatorom porównania można tworzyć zaawansowane, precyzyjne filtry.
Filtrowanie uruchomionych serwisów
PS C:\Users\Admin> Get-Service | Where-Object {$_.Status -eq 'Running'}
Status Name DisplayName
------ ---- -----------
Running ApHidMonitorServi… AlpsAlpine HID Monitor Service
Running Appinfo Application Information
Running AppXSvc AppX Deployment Service (AppXSVC)
Running AudioEndpointBuil… Windows Audio Endpoint Builder
Running Audiosrv Windows Audio
Running BFE Base Filtering Engine
Running BITS Background Intelligent Transfer Servi…
Running BluetoothUserServ… Usługa obsługi użytkownika protokołu …
Running BrokerInfrastruct… Background Tasks Infrastructure Servi…
Running BrYNSvc BrYNSvc
Jak to działa?Get-Service
– pobiera wszystkie usługi w systemie
|
– przekazuje każdy obiekt do kolejnego polecenia w potoku
Where-Object { $_.Status -eq 'Running' }
– dla każdej usługi sprawdza właściwość Status
, jeśli równa się Running
, usługa zostaje pokazana dalej, w przeciwnym razie zostaje odrzucona
Filtrowanie uruchomionych serwisów (metoda skrócona od PS w wersji 3.0)
PS C:\Users\Admin> Get-Service | Where-Object Status -eq Running
Status Name DisplayName
------ ---- -----------
Running ApHidMonitorServi… AlpsAlpine HID Monitor Service
Running Appinfo Application Information
Running AppXSvc AppX Deployment Service (AppXSVC)
Running AudioEndpointBuil… Windows Audio Endpoint Builder
Running Audiosrv Windows Audio
Running BFE Base Filtering Engine
Running BITS Background Intelligent Transfer Servi…
Running BluetoothUserServ… Usługa obsługi użytkownika protokołu …
Running BrokerInfrastruct… Background Tasks Infrastructure Servi…
Running BrYNSvc BrYNSvc
Jak to działa?
W zasadzie identycznie jak wyżej. Jedyna różnica to nieco inna składnia po cmdletcie Where-Object
, bez zastosowania script bloku { }
i bezpośredniego odwołania do zmiennej potokowej $_
Łączenie warunków (uruchomione serwisy z nazwą zaczynającą się od litery 'A’)
PS C:\Users\Admin> Get-Service | Where-Object {$_.Status -eq 'Running' -and $_.Name -like 'A*'}
Status Name DisplayName
------ ---- -----------
Running ApHidMonitorServi… AlpsAlpine HID Monitor Service
Running Appinfo Application Information
Running AppXSvc AppX Deployment Service (AppXSVC)
Running AudioEndpointBuil… Windows Audio Endpoint Builder
Running Audiosrv Windows Audio
Jak to działa?
W tym przypadku za pomocą operatora logicznego -and łączymy dwa warunki:
$_ .Status -eq 'Running'
– wybiera tylko działające (uruchomione) usługi
-and
– łączy oba warunki
$_ .Name -like 'A*'
– dodatkowo sprawdza, czy nazwa usługi zaczyna się na literę A
Zauważ, że działa tylko z wykorzystaniem bloku skryptowego { }
.
Poza poznanymi metodami PowerShell oferuje również inne sposoby filtrowania, z których część pozwala znacząco poprawić wydajność. Jednym z nich jest tzw. filtrowanie w lewo, czyli stosowanie filtrów jak najwcześniej w potoku. Niektóre cmdlety (np. Get-ADUser
, Get-ChildItem
) umożliwiają przekazanie kryteriów filtrowania już przy pierwszym wywołaniu, dzięki czemu do kolejnych etapów trafia tylko niezbędna ilość danych.
Filtrowanie plików po rozszerzeniu
PS C:\Users\Admin> Get-ChildItem -Path "C:\Test" -Filter *.txt
Directory: C:\Test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 15/09/2023 14:21 0 Nowa_Nazwa_01.txt
-a--- 15/09/2023 14:21 0 Nowa_Nazwa_02.txt
-a--- 15/09/2023 13:21 0 Nowa_Nazwa_03.txt
-a--- 15/09/2023 13:21 0 Nowa_Nazwa_04.txt
-a--- 15/09/2023 14:39 0 tekst.txt
-a--- 15/09/2023 14:38 56 tekst2.txt
Jak to działa?Get-ChildItem
– pobiera zawartość wskazanego katalogu
Path "C:\Test"
– określa ścieżkę, w której ma zostać wykonane wyszukiwanieFilter *.txt
– ogranicza wynik tylko do plików z rozszerzeniem.txt
💡 Warto wiedzieć
Litery we właściwości Mode należy interpretować w następujący sposób:
- l (link) – link do pliku/katalogu
- d (directory) – katalog
- a (archive) – plik archiwalny
- r (read only) – tylko do odczytu
- h (hidden) – ukryty
- s (system) – systemowy
Drugim, nieco nowocześniejszym podejściem jest zastosowanie metody .Where()
, która dostępna jest od PowerShell w wersji 4.0. Jest to metoda kolekcji, która działa znacznie szybciej niż klasyczny Where-Object
, oferując dodatkowe tryby działania, takie jak First
, Last
oraz filtrowanie z dostępem do indeksu
. To idealne rozwiązanie do pracy z dużymi zbiorami, gdzie liczy się precyzja i wydajność. Doskonale sprawdzi się więc w przypadku listy użytkowników domeny, pracy z serwisami czy analizie dzienników zdarzeń.
Filtrowanie uruchomionych serwisów
PS C:\Users\Admin> $services = Get-Service
PS C:\Users\Admin> $services.Where({$_.status -eq 'Running'})
Status Name DisplayName
------ ---- -----------
Running ApHidMonitorSer... AlpsAlpine HID Monitor Service
Running Appinfo Application Information
Running AppXSvc AppX Deployment Service (AppXSVC)
Running AudioEndpointBu... Windows Audio Endpoint Builder
Running Audiosrv Windows Audio
Running BFE Base Filtering Engine
Running BITS Background Intelligent Transfer Ser...
Running BluetoothUserSe... Usługa obsługi użytkownika protokoł...
Running BrokerInfrastru... Background Tasks Infrastructure Ser...
Running BrYNSvc BrYNSvc
Jak to działa?$services = Get-Service
– uruchamia Get-Service
i zapisuje wszystkie obiekty usług w zmiennej $services
$services.Where({ $_.Status -eq 'Running' })
– używa metody .Where()
dostępnej dla kolekcji:
- dla każdego elementu sprawdza warunek (
Status -eq 'Running'
) - zwraca tylko te obiekty, które spełniają warunek
Sortowanie danych — Sort-Object
Sortowanie obiektów to proces porządkowania danych na podstawie określonych właściwości, co ułatwia ich analizę i prezentację. W PowerShellu najczęściej wykorzystuje się do tego celu cmdlet Sort-Object
, który pozwala na sortowanie wyników w kolejności rosnącej (Ascending)
, jak i malejącej (Descending)
. Możliwe jest również sortowanie według wielu właściwości jednocześnie, co bywa przydatne przy pracy ze złożonymi strukturami danych. Dzięki obsłudze wyrażeń oraz bloków skryptowych Sort-Object
pozwala na bardziej zaawansowane i elastyczne podejście do sortowania.
Sortowanie według jednej wartości, malejąco
PS C:\Users\Admin> Get-ChildItem | Sort-Object -Property Length -Descending
Directory: C:\Users\Admin
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 06/06/2024 08:46 113606 raport_DELL.html
-a---- 02/06/2024 23:20 104572 raport_.html
-a---- 05/06/2024 22:17 54076 proc.htm
-a---- 06/06/2024 09:46 19608 procesy.html
-a---- 17/01/2025 14:44 19598 ServiceLog.txt
-a---- 18/09/2023 09:14 6193 soft.csv
-a---- 05/06/2024 09:48 5452 users_.csv
-a---- 27/06/2024 20:00 5452 AD_users.csv
-a---- 27/06/2024 20:07 5202 ADusers2.csv
-a---- 27/06/2024 20:09 4952 ADusers.csv
-a---- 07/02/2022 11:16 4921 users.csv
-a---- 06/06/2024 08:45 2734 ComputerReport.html
-a---- 06/06/2024 09:50 1310 computer.html
Jak to działa?Get-ChildItem
– pobiera zawartość bieżącego katalogu
Sort-Object
– sortuje otrzymane obiekty:
-Property Length
– kryterium sortowania to rozmiar pliku w bajtach-Descending
– kolejność malejąca (od największych plików do najmniejszych)
Sortowanie według kilku właściwości
PS C:\Users\Admin> Get-Service | Sort-Object -Property Status, DisplayName
Status Name DisplayName
------ ---- -----------
Stopped AxInstSV ActiveX Installer (AxInstSV)
Stopped ADPSvc ADPSvc
Stopped AarSvc_124270 Agent Activation Runtime_124270
Stopped AppReadiness App Readiness
Stopped AppIDSvc Application Identity
Stopped ALG Application Layer Gateway Service
Stopped AppMgmt Application Management
Stopped AssignedAccessM... AssignedAccessManager Service
Stopped tzautoupdate Auto Time Zone Updater
Stopped BEService BattlEye Service
Stopped BDESVC BitLocker Drive Encryption Service
Stopped wbengine Block Level Backup Engine Service
Stopped PeerDistSvc BranchCache
Jak to działa?Get-Service
– pobiera wszystkie usługi w systemie.
Sort-Object -Property Status, DisplayName
– sortuje wynik według dwóch właściwości:
- najpierw
Status
(czyli grupuje np. uruchomione i zatrzymane), - potem
DisplayName
(alfabetycznie w ramach tego samego statusu).
Wybieranie właściwości — Select-Object
Wybieranie obiektów w PowerShellu to kolejna technika pozwalająca zwiększyć czytelność wyników. Zwykle realizowane jest z wykorzystaniem cmdletu Select-Object
, który pełni kluczową rolę w przetwarzaniu i prezentowaniu danych. Umożliwia wybór określonych właściwości obiektów, ograniczenie liczby wyników, a także filtrowanie unikalnych wartości. Select-Object
jest niezwykle elastyczny, gdyż pozwala nie tylko na pobieranie danych w surowej postaci, ale również na tworzenie wyliczanych wartości (ang. calculated properties), czyli niestandardowych kolumn z użyciem wyrażeń skryptowych. Dzięki temu można w prosty sposób przekształcać dane na potrzeby raportowania, analiz czy eksportu.
Wybieranie konkretnych właściwości
PS C:\Users\Admin> Get-Process | Select-Object Name, CPU, WorkingSet
Name CPU WorkingSet
---- --- ----------
AggregatorHost 6094848
ApMsgFwd 360.21875 1970176
ApntEx 0.1875 1122304
Apoint 132.171875 3387392
AppActions 4.359375 4972544
ApplicationFrameHost 5.5 34295808
AppVShNotify 0.0625 1228800
ApRemote 0.09375 561152
audiodg 1.15625 22032384
Jak to działa?Get-Process
– pobiera listę wszystkich uruchomionych procesów w systemie
Select-Object
– wybiera tylko wskazane właściwości:
Name
– nazwa procesuCPU
– czas procesora zużyty przez proces (w sekundach)WorkingSet
– ilość pamięci RAM zajętej przez proces (w bajtach)
Ograniczanie liczby wyników
PS C:\Users\Admin> Get-ChildItem | Select-Object -First 5
Directory: C:\Users\Admin
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 05/01/2024 21:22 .android
d----- 18/09/2023 16:59 .Azure
d----- 11/09/2025 18:51 .cache
d----- 23/09/2023 12:37 .lim
d----- 20/09/2025 12:25 .n8n
Jak to działa?Get-ChildItem
– pobiera zawartość bieżącego katalogu
Select-Object -First 5
– wybiera tylko pierwsze 5 elementów z listy
Wybieranie unikalnych wartości
PS C:\Users\Admin> Get-Process | Select-Object -Property ProcessName -Unique
ProcessName
-----------
AggregatorHost
ai
ApMsgFwd
ApntEx
Apoint
AppActions
ApplicationFrameHost
AppVShNotify
Jak to działa?Get-Process
– pobiera wszystkie uruchomione procesy
Select-Object -Property ProcessName -Unique
– wybiera tylko nazwę procesu i usuwa duplikaty (jeśli ten sam proces działa w wielu instancjach, np. chrome
).
Tworzenie calculated properties
PS C:\Users\Admin> Get-ChildItem -File | Select-Object Name, @{Name="Size[KB]";Expression={"{0:N2}" -f ($_.length/1KB)}}
Name Size[KB]
---- --------
ADusers.csv 4.84
ADusers2.csv 5.08
AD_users.csv 5.32
art2.png 0.35
computer.html 1.28
ComputerReport.html 2.67
Jak to działa?Get-ChildItem -File
– pobiera wszystkie pliki z bieżącego katalogu (z wykluczeniem katalogów)
Select-Object
– wybiera dwie właściwości:
Name
– nazwa pliku,@{Name=...; Expression=...}
– calculated property:Name="Size[KB]"
– ustawia nagłówek kolumnyExpression={"{0:N2}" -f ($_.Length/1KB)}
– dzieli rozmiar pliku (Length
) przez 1 KB, formatuje wynik z dwoma miejscami po przecinku
Łączenie filtrowania, sortowania i wyboru
W praktyce najczęściej używa się tych cmdletów razem w potokach, dzięki czemu istenieje możliwość dość precyzyjnej manipulacji na danych.
Znajdź 5 największych pliki w katalogu domowym
PS C:\Users\Admin> Get-ChildItem -File | Sort-Object Length -Descending | Select-Object Name, Length -First 5
Name Length
---- ------
raport_DELL.html 113606
raport_.html 104572
proc.htm 54076
procesy.html 19608
ServiceLog.txt 19598
Jak to działa?Get-ChildItem -File
– pobiera wszystkie pliki z bieżącego katalogu.
Sort-Object Length -Descending
– sortuje pliki według rozmiaru (Length
) w kolejności malejącej
Select-Object
– wybiera tylko określone właściwości:
Name
– nazwa plikuLength
– rozmiar pliku w bajtachFirst 5
– tylko 5 pierwszych wyników
Dlaczego to takie ważne?
Odpowiednio zastosowane filtrowanie i wybieranie danych jest niezwykle istotne, gdyż pozwala pracować tylko z tymi obiektami, które nas interesują. Dzięki temu unikasz przetwarzania całych, często ogromnych zestawów danych. W rezultacie skrypty są szybsze, bardziej czytelne i mniej obciążają system. A zatem zyskujesz:
- Efektywność: zamiast obrabiać 10 000 elementów, możesz pracować tylko na kilku potrzebnych.
- Czytelność: czyste dane są łatwiejsze do analizy, raportowania i prezentacji.
- Automatyzacja: skrypty działające w tle wymagają precyzyjnie przefiltrowanych danych, aby unikać błędów i zbędnych kroków.
Podsumowanie
Opanowanie cmdletów Where-Object
, Sort-Object
i Select-Object
uczyni Cię dużo skuteczniejszym w pracy z PowerShellem. To tak, jakbyś miał w ręku skalpel do danych, możesz wyciąć dokładnie to, czego potrzebujesz z dużych zbiorów informacji.
Dla ambitnych:
Ćwicz i eksperymentuj: przetestuj te polecenia na własnych procesach, usługach i katalogach. Z czasem odkryjesz jeszcze więcej potężnych kombinacji i filtrów.
To wszystko na dziś!
Jeśli masz ciekawe spostrzeżenia lub doświadczenia w tym temacie – koniecznie podziel się nimi w komentarzach.
A jeśli moje materiały są dla Ciebie pomocne, możesz postawić mi wirtualną kawę.
Dzięki za wsparcie!


Adam Pietrzak
Trener IT | Autor szkoleń | Entuzjasta PowerShellaAdministrator systemów i sieci wsparcia działań wojskowych z ponad 10-letnim doświadczeniem. Praktyk w dziedzinie bezpieczeństwa systemu Windows, automatyzacji zadań (PowerShell) oraz rozwiązań chmurowych. Trener i twórca materiałów edukacyjnych (szkolenia, warsztaty, artykuły, podręczniki). Pasjonat dzielenia się wiedzą i wspierania początkujących administratorów IT. Prywatnie – amator aktywnego wypoczynku i rodzinnych podróży.