Monitorowanie przestrzeni dyskowej, choć z pozoru wydaję się prostym zadaniem, to nie zawsze wygląda tak samo. Na początek należałoby określić jakie parametry dysku i jak chcemy monitorować, jakich narzędzi użyjemy w tym celu oraz jak zareagujemy w razie ewentualnych alertów. Dodatkowo na rynku dostępnych jest wiele narzędzi, które doskonale spełniają to zadanie. Sam Windows zawiera szereg narzędzi przydatnych do monitorowania wydajności komputera. Jednym z nich jest konsola Monitor wydajności czy narzedzie Storage Sense. Co, jednak jeżeli sam chciałbyś stworzyć narzędzie do monitorowania? Jak zwykle z pomocą przychodzi PowerShell.
Na potrzeby tego konkretnego wpisu skupimy się na monitorowaniu lokalnego i zdalnego komputera. Wartością, którą chcemy kontrolować, będzie procent wolnej przestrzeni dyskowej. Niestety PowerShell nie dysponuje gotowym rozwiązaniem, tak więc obliczenia będzie trzeba wykonać samodzielnie, a wartość tę możemy opisać prostym wzorem:

Dane niezbędne do wykonania obliczeń, możemy uzyskać na kilka sposobów:
Get-PSDrive
Jedną z najprostszych możliwości jest wykorzystanie cmdletu Get-PSDrive
, który wyświetla informacje o wszystkich dostępnych „napędach” w bieżącej sesji PowerShella. Ale uwaga: PSDrive to nie to samo co dysk twardy!
Jak możesz zauważyć samo wykonanie polecenia zwróci nam informacje o wszystkich dostepnych lokalizacjach:
PS C:\Users\Admin> Get-PSDrive
Name Used (GB) Free (GB) Provider Root CurrentLocation
---- --------- --------- -------- ---- ---------------
Alias Alias
C 434.47 41.58 FileSystem C:\ Users\Admin
Cert Certificate \
Env Environment
Function Function
HKCU Registry HKEY_CURRENT_USER
HKLM Registry HKEY_LOCAL_MACHINE
Variable Variable
WSMan WSMan
Aby wyświetlić dane, które nas interesują konieczne będzie dodanie odpowiedniego parametru -PSProvider FileSystem
.
PS C:\Users\Admin> Get-PSdrive -PSProvider FileSystem
Name Used (GB) Free (GB) Provider Root CurrentLocation
---- --------- --------- -------- ---- ---------------
C 434.33 41.73 FileSystem C:\ Users\Admin
Dzięki temu uzyskamy informacje tylko i wyłacznie dotyczace systemu plików, a tym samym przestrzeni dyskowej. Ostatnim elementem tej układanki będzie wyrażenie wolnego miejsca jako procenta, w tym celu posłużymi się tablicą mieszającą i odpowiednim formatowaniem.
PS C:\Users\Admin> Get-PSdrive -PSProvider filesystem | Select-Object `
Name,
@{Name="Used (GB)";Expression={"{0:N2}" -f ($_.used/1gb)}},
@{Name="Free (GB)";Expression={"{0:N2}" -f($_.free/1gb)}},
@{Name="Free (%)";Expression={"{0:P0}" -f(($_.free) / ($_.Used+$_.Free))}}
Name Used (GB) Free (GB) Free (%)
---- --------- --------- --------
C 434.32 41.73 9%
Jak to działa?
Get-PSDrive
: pobiera wszystkie „dyski” znane PowerShellowi (czyli logiczne jednostki jak C:, D: , ale też Env:, Registry: itd.).
-PSProvider FileSystem
: ogranicza wynik tylko do dysków opartych na systemie plików
Select-Object
: pozwala wybrać i przekształcić konkretne właściwości:
Name
: wyświetla nazwę dysku (np. C, D).Used (GB)
: wyświetla ilość zajętego miejsca na dysku przekonwertowaną na GB i zaokrągloną do 2 miejsc po przecinkuFree (GB)
: wyświetla ilość wolnego miejsca na dysku wyrażona w GB i zaokrogląną do 2 miejsc po przecinku,Free (%)
: wyświetla ilość wolnego miejsca na dysku wyrażoną w procentach
⚠️ Uwaga
Cmdlet działa tylko na lokalnych dyskach – nie pokazuje udziałów sieciowych
Wartość Used
i Free
może nie istnieć, jeśli dysk jest niedostępny – warto dodać walidację, jeśli zamierzasz rozbudować ten kod.
Get-WmiObject (Windows PowerShell)
Kolejnym sposobem może być skorzystanie z mechanizmu WMI (Windows Management Instrumentation). Jest to wbudowane w Windows narzędzie do zarządzania systemem i automatyzacji. Umożliwia pobieranie szczegółowych informacji o sprzęcie, oprogramowaniu i stanie systemu, a także wykonywanie operacji administracyjnych – np. monitorowanie procesów, usług, kart sieciowych czy dysków. Dzięki zastosowaniu odpowiednich klas możesz uzyskać dostęp do szeregu szczegółowych informacji o wybranej maszynie. W moim przykładzie posłużę się cmdletem Get-WmiObject
oraz klasą Win32_LogicalDisk
, która zwróci podstawowe dane dotyczące dysku.
PS C:\Users\Admin> Get-WmiObject -Class Win32_LogicalDisk
DeviceID : C:
DriveType : 3
ProviderName :
FreeSpace : 46233636864
Size : 511160872960
VolumeName :
DeviceID : D:
DriveType : 2
ProviderName :
FreeSpace : 9398272
Size : 10534912
VolumeName : GARMIN
Po wykonaniu polecenia uzyskałem dane o dyskach wykrytych w systemie. Obejmują one identyfikator dysku, jego typ, ilość wolnego miejsca, całkowity rozmiar oraz nazwę wolumenu. Wśród wyników pojawiły się dyski różnych typów (DeviceType), ale interesują mnie tylko dyski lokalne. Dlatego zastosuję filtr, który uwzględni wyłącznie dyski z wartością DriveType
równą 3 – odpowiadającą dyskom lokalnym. Na koniec przedstawię dane w formie czytelnej tabeli.
PS C:\Users\Admin> Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType = 3" | Format-Table
DeviceID DriveType ProviderName FreeSpace Size VolumeName
-------- --------- ------------ --------- ---- ----------
C: 3 45844889600 511160872960
Jak możesz zauważyć, teraz wygląda to nieco lepiej, choć całkowity rozmiar dysku oraz ilość wolnego miejsca wyrażone zostały w bajtach, co nie do końca dobrze się prezentuje i może być dość kłopotliwe w interpretacji. Dodatkowo część informacji jest nadmiarowa. Czas zatem na małe przemeblowanie i wybranie tylko tych danych, które są niezbędne. Dokonamy również przekształcenia na wartości, które będą bardziej przyjazne, w tym wypadku będą to Gigabajty [GB].

Tym razem polecenie będzie nieco bardziej złożone, dlatego zalecam skopiowanie go i wklejenie bezpośrednio do Twojej konsoli PowerShell.
PS C:\Users\Admin> Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType = 3" | Select-Object `
@{Name="Name";Expression={$_.deviceID}},
@{Name="Size (GB)";Expression={"{0:N2}" -f ($_.size/1gb)}},
@{Name="Free (GB)";Expression={"{0:N2}" -f ($_.freespace/1gb)}},
@{Name="Free (%)";Expression={"{0:P0}" -f(($_.freespace/1gb) / ($_.size/1gb))}}
Name Size (GB) Free (GB) Free (%)
---- ---------- ---------- ---------
C: 476.06 42.42 9%
Teraz całość wygląda zdecydowanie lepiej. Oprócz danych takich jak całkowity rozmiar dysku i ilość wolnego miejsca wyrażoną w GB udało się pozyskać również konkretną informację. A mianowicie procent, jaki stanowi wolna przestrzeń dyskowa w odniesieniu do całkowitego rozmiaru dysku.
Jak to działa?
Get-WmiObject
: pobiera dane z WMI
-Class Win32_LogicalDisk
: klasa, która zawiera informacje o logicznych dyskach
-Filter "DriveType = 3"
: filtruje tylko lokalne dyski twarde
Select-Object
: identycznie jak w poprzednim przykładzie (w tym wypadku dysponujemy całkowitym rozmiarem, stąd obliczenie procent wolnej przestrzeni będzie nieco łatwiejsze).
Get-CmiInstance
Nastepna metoda to mechanizm CIM (Common Information Model), czyli nowocześniejsza alternatywa dla WMI, działająca szybciej i wydajniej, szczególnie w środowiskach zdalnych. Umożliwia pobieranie i zarządzanie informacjami o systemie Windows, ale korzysta z nowszego podejścia opartego na protokole WS-Man zamiast DCOM. Dzięki temu jest bardziej bezpieczne i mniej podatne na problemy z uprawnieniami. CIM oferuje te same klasy co WMI, ale używa cmdletów Get-CimInstance
zamiast Get-WmiObject
.
PS C:\Users\Admin> Get-CimInstance -Class Win32_LogicalDisk
DeviceID DriveType ProviderName VolumeName Size FreeSpace
-------- --------- ------------ ---------- ---- ---------
C: 3 511160872960 45549408256
Identycznie wygląda to w przypadku chęci pozyskania wartości wyrażonej w procentach.
PS C:\Users\Admin> Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType = 3" |
Select-Object `
@{Name = "Name"; Expression = { $_.DeviceID } },
@{Name = "Size (GB)"; Expression = { "{0:N2}" -f ($_.Size / 1GB) } },
@{Name = "Free (GB)"; Expression = { "{0:N2}" -f ($_.FreeSpace / 1GB) } },
@{Name = "Free (%)"; Expression = { "{0,6:P0}" -f (($_.FreeSpace / 1GB) / ($_.Size / 1GB))}}
Name Size (GB) Free (GB) Free (%)
---- ----------- ---------- ---------
C: 476.06 42.42 9%
Jak to działa?
Mechanizm identyczny jak poprzednio. Jedyna różnica to wykorzystanie CIM do pobrania danych z klasy WMI.
Zdalne monitorowanie przestrzeni dyskowej
Jeżeli chodzi o monitorowanie komputerów zdalnych, to zasadniczo stosuje się dwa podejścia. Możesz posłużyć się cmdletem Invoke-Command
, jak w przykładzie poniżej:
PS C:\Users\Admin> Invoke-Command -ComputerName Komp1, Komp2, Komp3 {
Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType = 3" | Select-Object `
@{Name="Dysk";Expression={$_.deviceID}},
@{Name="Rozmiar(GB)";Expression={"{0:N2}" -f ($_.size/1gb)}},
@{Name="Wolne (GB)";Expression={"{0:N2}" -f ($_.freespace/1gb)}},
@{Name="Wolne (%)";Expression={"{0,6:P0}" -f(($_.freespace/1gb) / ($_.size/1gb))}}} | ft
ComputerName Disk Rozmiar(GB) Wolne (GB) Wolne (%)
------------- ---- ----------- ------------ ----------
Komp1 C: 237,00 120,50 51%
Komp2 C: 119,00 30,75 26%
Komp2 E: 465,00 200,00 43%
Komp3 C: 512,00 400,00 78%
Gdzie Komp1, Komp2, Komp3 to nazwy komputerów do monitorowania.
Opcja druga to wykorzystanie wbudowanych mechanizmów Remote WMI lub CIM:
PS C:\Users\Admin> Get-CimInstance -ComputerName Komp1, Komp2, Komp3 `
-Class Win32_LogicalDisk -Filter "DriveType = 3" | Select-Object `
@{Name = "Dysk"; Expression = { $_.DeviceID } },
@{Name = "Rozmiar(GB)"; Expression = { "{0:N2}" -f ($_.Size / 1GB) } },
@{Name = "Wolne (GB)"; Expression = { "{0:N2}" -f ($_.FreeSpace / 1GB) } },
@{Name = "Wolne (%)"; Expression = { "{0,6:P0}" -f (($_.FreeSpace / 1GB) / ($_.Size / 1GB)) } } | ft
Dysk Rozmiar(GB) Wolne (GB) Wolne (%)
---- ----------- ------------ ----------
C: 237,00 120,50 51%
C: 119,00 30,75 26%
E: 465,00 200,00 43%
C: 512,00 400,00 78%
Dla ambitnych
Wiesz już jak zabrać się za monitorowanie przestrzeni dyskowej. Teraz w zależności od potrzeb dodając np.: instrukcję warunkową (if…else itp.) możesz wedle uznania wykonywać konkretne akcje. Przykładowo jeżeli ilość wolnego miejsca wyrażona w procentach spadnie poniżej 20% (co uznawane jest za bezpieczną granicę) możesz przejść do kolejnych czynności, takich jak wysłanie alarmu dla administratora, automatyczne wyszukiwanie zbędnych plików i katalogów czy usuwanie nadmiarowych danych. Zadania te postaram się omówić w oddzielnym wpisie.
Zobacz też:
https://docs.microsoft.com/en-us/windows/win32/wmisdk/about-wmi
https://docs.microsoft.com/en-us/windows/win32/wmisdk/common-information-model
https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-logicaldisk
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.