Cześć, miło znów Cię widzieć. W poprzednich materiałach skupialiśmy się na pracy z danymi, logiką obiektową oraz tworzeniu własnych funkcji. Teraz pora przejść do czegoś, co każdy administrator i każda osoba automatyzująca zadania musi dobrze opanować, czyli praca z systemem plików. Na szczęście PowerShell daje pełną kontrolę nad plikami i katalogami za pomocą kilku prostych poleceń. Z konsoli możesz tworzyć, kopiować, przenosić, zmieniać nazwy i usuwać pliki oraz katalogi, a także łatwo wplatać te działania w skrypty. W tym wpisie dowiesz się czym, jest system plików, jakie podstawowe cmdlety służą do pracy z plikami i katalogami oraz poznasz kilka ciekawych przykładów. A zatem miłego czytania.
Czym jest system plików?
Zanim zagłębimy się w temat pracy z plikami i katalogami, warto doprecyzować kilka kwestii. Po pierwsze warto wiedzieć, że system plików nie jest jedynie sposobem na porządkowanie danych, ale stanowi fundament działania systemu operacyjnego. Każdy element systemu, począwszy od aplikacji użytkownika po kluczowe komponenty systemowe, istnieje jako plik lub zbiór plików zorganizowanych w logiczną strukturę. W zdecydowanej większości przypadków hierarchia ta przypomina model drzewa (obraz poniżej), co pozwala na jednoznaczne adresowanie zasobów, a także sprawniejsze odszukiwanie, modyfikowanie czy kontrolowanie dostępu do informacji.
W systemie Windows katalog główny jest oznaczony literą dysku (np. C:\) i stanowi punkt startowy dla całej struktury. Kolejne poziomy odzwierciedlają logiczny podział zasobów. Przykładowo C:\Windows zawiera podstawowe pliki systemu, a C:\Program Files przechowuje oprogramowanie zainstalowane przez użytkownika. Dzięki temu hierarchicznemu układowi możliwe jest nie tylko utrzymanie porządku, ale także implementacja mechanizmów bezpieczeństwa, takich jak uprawnienia użytkowników czy kontrola dostępu.
W świecie PowerShellua praca z plikami i katalogami jest ujednolicona dzięki tzw. providerowi systemu plików, który umożliwia obsługę plików i dostęp do danych zapisanych na dysku. To podejście sprawia, że zarządzanie zasobami staje się spójne, intuicyjne i idealnie nadaje się do automatyzacji.
Dlaczego warto zarządzać plikami i katalogami z poziomu PowerShella?
Zdecydowana większość użytkowników systemu Windows przyzwyczajona jest do powłoki graficznej i wykonywania wszystkich operacji za pomocą myszy. Jednak zamiast żmudnego klikania w Eksploratorze Windows, możesz uzyskać znacznie większą kontrolę i efektywność wykorzystując domyślne cmdlety. PowerShell daje nie tylko wygodę, ale przede wszystkim przewagę, której nie da Ci tradycyjny interfejs graficzny:
Szybkość
Masowe operacje takie jak kopiowanie, zmiana nazw, tworzenie czy usuwanie setek plików mogą zostać wykonane w ułamku sekundy. Coś, co w GUI trwałoby kilka minut, PowerShell zrobi niemal natychmiast.
Automatyzacja
Każdy krok, który wykonujesz, można zapisać w skrypcie i uruchamiać w dowolnym momencie lub w harmonogramie. Zamiast pamiętać cały proces, możesz uruchomić jeden plik .ps1.
Powtarzalność i brak błędów
Nie popełnisz przypadkowego błędu, jeśli operacja jest jasno zdefiniowana w skrypcie. Raz stworzony zestaw poleceń wykona zadanie identycznie za każdym razem, niezależnie od tego, kto go uruchamia.
Skalowalność
To samo polecenie działa zarówno na jednym pliku, jak i na dziesiątkach tysięcy. Nie musisz zmieniać sposobu działania, po prostu wskazujesz większy zakres danych lub inne maszyny zdalne.
Praca zdalna
PowerShell pozwala zarządzać plikami na serwerach i komputerach zdalnych bez konieczności logowania się na każdą z maszyn. Jedna konsola by zapanować nad wieloma lokalizacjami.
Integracja z innymi narzędziami
Możesz łączyć operacje plikowe z usługami chmurowymi, API, Active Directory czy bazami danych. PowerShell może stać się elementem większego ekosystemu automatyzacji w Twoim środwisku.
Podstawowe zadania w pracy z plikami i katalogami
Tworzenie i modyfikacja
Praca z plikami i katalogami to jeden z podstawowych obszarów administracji systemowej, a PowerShell dostarcza precyzyjnych i spójnych mechanizmów do realizacji tych zadań. Tworzenie nowych elementów najczęściej wykonuje się za pomocą New-Item (ni), które pozwala definiować zarówno pliki, jak i katalogi w sposób w pełni kontrolowany. W codziennej pracy kluczowa jest również modyfikacja istniejących zasobów od zmiany zawartości, przez aktualizację atrybutów, aż po operacje nadpisywania. W tych scenariuszach stosuje się Set-Content (sc), wykorzystywane standardowo do aktualizowania wartości elementów oraz Set-ItemProperty (sp) do zmiany atrybutów. Wszystkie wymienione cmdlety stanowią solidną podstawę do budowania bardziej zaawansowanych procesów automatyzacji związanych z zarządzaniem zasobami systemu plików.
New-Item
Tworzenie nowego pliku:
PS C:\Users\Admin> New-Item -Path "C:\Temp\Nowy_Plik.txt" -ItemType File
Directory: C:\Temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 23/11/2025 15:20 0 Nowy_Plik.txt
Co tu się dzieje?
- Cmdlet
New-Itemtworzy nowy element w obsługiwanym przez PowerShell providerze. - Parametr
-Pathwskazuje lokalizację oraz nazwę tworzonego elementu. W naszym przykładzie będzie toC:\Temp\Nowy_Plik.txt. - Parametr
-ItemType Fileokreśla, że tworzony element ma być plikiem (domyślnie tworzony jest katalog). - W trakcie operacji PowerShell sprawdza, czy katalog docelowy (czyli
C:\Temp) istnieje, jeżeli nie zostanie zwrócony błąd. - Następnie sprawdza czy docelowy plik istnieje, jeżeli tak to polecenie kończy się błędem, a plik nie jest nadpisany. Jeśli plik nie istnieje, PowerShell tworzy nowy pusty plik.
- Po utworzeniu pliku polecenie zwraca informacje o nowym elemencie.
Tworzenie nowego katalogu:
PS C:\Users\Admin> New-Item -Path "C:\Temp\Nowy_Katalog" -ItemType Directory
Directory: C:\Temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 23/11/2025 15:20 Nowy_Katalog
Co tu się dzieje?
- Początek działa identycznie jak poprzednio, tym razem parametr
-ItemTypeprzyjmuje wartosćDirectoryi określa, że tworzony element ma być katalogiem. - Następnie PowerShell sprawdza, czy katalog o takiej nazwie istnieje, jeżeli nie to oczywiście zostaje utworzony, jeżeli tak to polecenie zakończy się błędem.
- Po utworzeniu katalogu, pojawi się informacja o nowym elemencie.
Out-File (nieco inne podejście do tworzenia plików)
Utworzenie 10 plików z zawartością:
PS C:\Users\Admin> 1..10 | ForEach-Object {Out-File -InputObject “Plik nr: $_” -FilePath “C:\Temp\Nowy_Katalog\plik$_.txt”}
Co tu się dzieje?
- Na początek operator zakresu
.., który tworzy tablicę liczb od 1 do 10. - Następnie tablica trafia do cmdletu
ForEach-Object, gdzie dla każdej wartości wykonana zostanie operacja znajdująca się w script bloku. - W tym konkretnym przypadku będzie to
Out-File, który domyślnie wysyła dane do pliku, a jeżeli plik nie istnieje to go tworzy. - Z pomocą parametru
-InputObjectdodajemy informacje, które zostaną zapisane do pliku. - Parametr
-FilePathsłuży do sprecyzowania ścieżki dostępu.
Set-Content
PS C:\Users\Admin> Set-Content -Path "C:\Temp\Nowy_Plik.txt" -Value "Nowa treść pliku po aktualizacji."
Co tu się dzieje?
- W tym scenariuszu cmdlet
Set-Contemtsłuży do dodania lub modyfikacji zawartości pliku tekstowego określonego przez parametr-Path. - Parametr
-Valueodpowiada za treść.
💡Warto wiedzieć
Cmdlet
Set-Contentmożna również wykorzystać do tworzenia plików z konkretną zawartości np.:Set-Content -Path .\DateTime.txt -Value (Get-Date)To polecenie stworzy plik z aktualną datą (jeżeli taki plik wcześniej nie istniał).
Set-ItemProperty
PS C:\Users\Admin> ls -Path C:\Temp
Directory: C:\Temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 23/11/2025 15:48 Archiwum
d----- 23/11/2025 15:22 Backup
-a---- 26/11/2025 21:13 21 Nowy_Plik.txt
PS C:\Users\Admin> Set-ItemProperty -Path "C:\Temp\Nowy_Plik.txt" -Name Attributes -Value ReadOnly -Verbose
VERBOSE: Performing the operation "Set Property File" on target "Item: C:\Temp\Nowy_Plik.txt Property: Attributes Value: ReadOnly".
PS C:\Users\Admin> ls -Path C:\Temp
Directory: C:\Temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 23/11/2025 15:48 Archiwum
d----- 23/11/2025 15:22 Backup
--r--- 26/11/2025 21:13 21 Nowy_Plik.txt
Co tu się dzieje?
- Na początek polecenie
ls -Path C:\Temp, dzięki któremu jestem w stanie pokazać ci atrybuty plikuNowy_Plik.txt. - Następnie cmdlet
Set-ItemProperty, który w tym konkretnym przypadku posłuży do zmiany atrybutu pliku. - Parametr
-Pathokreśla konkretny plik, parametr-Nameokreśla, że modyfikowana będzie właściwość odpowiadająca za atrybuty systemowe pliku, a-Valueustawia atrybut pliku na „tylko do odczytu”. Dodatkowo dorzuciłem-Verbose, żeby uzyskać jakieś informacje odnośnie tego co się dzieje. - Po wykonaniu polecenia plik fizycznie staje się plikiem tylko do odczytu i nie można go edytować bez zmiany tego atrybutu.
- Na koniec ponownie
ls -Path C:\Temp, żeby udowodnić zmianę atrybutu.
Kopiowanie
W przypadku PowerShella kopiowanie plików opiera się na cmdlecie Copy-Item (copy, cp lub cpi), który pozwala przenosić pliki i katalogi między lokalizacjami w sposób powtarzalny i dający się łatwo zautomatyzować. Mechanizm ten wspiera zarówno ścieżki lokalne, jak i sieciowe, dzięki czemu doskonale nadaje się do pracy w środowiskach serwerowych. Kopiowanie może zachować strukturę katalogów, nadpisywać istniejące pliki lub pomijać je w zależności od potrzeb. PowerShell umożliwia również filtrowanie elementów po nazwie lub wzorcach, co ułatwia selektywne kopiowanie większych zbiorów danych.
Copy-Item
Kopiowanie pliku:
PS C:\Users\Admin> Copy-Item -Path "C:\Temp\Nowy_Plik.txt" -Destination "C:\Temp\Backup\Nowy_Plik.txt"
Co tu się dzieje?
- Na pocztek
Copy-Item, który służy do kopiowania elementów w ramach systemu plików. - Następnie parametr
-Path, który wskazuje plik do skopiowania (C:\Temp\Nowy_Plik.txt). - kolejny parametr
-Destinationokreśla miejsce docelowe, do którego plik ma zostać skopiowany (C:\Temp\Backup\Nowy_Plik.txt) - PowerShell sprawdza, czy źródłowy plik istnieje, jeżeli nie to tworzy kopię pliku w docelowej lokalizacji. Jeśli plik o tej samej nazwie istnieje w miejscu docelowym, zostanie nadpisany tylko wtedy, gdy użyjesz
-Force.
💡 Warto wiedzieć
Podczas kopiowania można zmienić nazwę pliku, podając inną nazwę w parametrze
-DestinationMożna również przenosić kilka plików filtrując po nazwie lub rozszerzeniu stosując wildcard np.
C:\Temp\*.txttaki zapis bedzie dotyczył tylko i wyłącznie plików teksotywch
Kopiowanie katalogu razem z zawartością:
PS C:\Users\Admin> Copy-Item -Path "C:\Temp\Nowy_Katalog" -Destination "C:\Temp\Backup\" -Recurse -PassThru
Directory: C:\Temp\Backup
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 23/11/2025 15:22 Nowy_Katalog
Directory: C:\Temp\Backup\Nowy_Katalog
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 23/11/2025 15:21 26 plik1.txt
-a---- 23/11/2025 15:21 28 plik10.txt
-a---- 23/11/2025 15:21 26 plik2.txt
-a---- 23/11/2025 15:21 26 plik3.txt
-a---- 23/11/2025 15:21 26 plik4.txt
-a---- 23/11/2025 15:21 26 plik5.txt
-a---- 23/11/2025 15:21 26 plik6.txt
-a---- 23/11/2025 15:21 26 plik7.txt
-a---- 23/11/2025 15:21 26 plik8.txt
-a---- 23/11/2025 15:21 26 plik9.txt
Co tu się dzieje?
- Początek polecenia identycznie jak poprzednio, tym razem jednak bazujemy na katalogach.
- Parametr
-Recursenakazuje skopiowanie całej zawartości katalogu źródłowego, włączając w to podkatalogi i znajdujące się w nich pliki. - Parametr
-PassThrupowoduje, że skopiowane elementy zostaną wyświetlone w konsoli jako obiekty (w przeciwnym razie PowerShell nie zwróci żadnych informacji, a w tym wypadku warto wiedzieć co się skopiowało).
Przenoszenie
Jeżeli chodzi o przenoszenie to pomocny może okazać się cmdlet Move-Item (move, mi lub mv), który jednocześnie kopiuje element do nowej lokalizacji i usuwa go ze starej. Polecenie obsługuje zarówno pliki, jak i katalogi, działając na ścieżkach lokalnych oraz sieciowych. Podczas przenoszenia możesz kontrolować nadpisywanie istniejących danych, co pozwala bezpiecznie zarządzać kolizjami nazw. Move-Item również wspiera filtrowanie po nazwach i wzorcach, dzięki czemu łatwo przenosić tylko wybrane pliki z większych struktur.
Move-Item
Przenoszenie pliku:
PS C:\Users\Admin> Move-Item -Path "C:\Temp\Nowy_Plik.txt" -Destination "C:\Temp\Archiwum\Nowy_Plik.txt" -PassThru
Directory: C:\Temp\Archiwum
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 23/11/2025 15:20 35 Nowy_Plik.txt
Co tu się dzieje?
Move-Item -Pathwskazuje lokalizację źródłowego pliku, który ma zostać przeniesiony.- Parametr
-Destinationdefiniuje nową ścieżkę i nazwę pliku w katalogu docelowym. - PowerShell przenosi plik z lokalizacji źródłowej do wskazanego katalogu
Archiwum. - Parametr
-PassThrupowoduje zwrócenie obiektu reprezentującego przeniesiony plik po zakończeniu operacji.
Przenoszenie katalogu:
PS C:\Users\Admin> Move-Item -Path "C:\Temp\Nowy_Katalog" -Destination "C:\Temp\Archiwum\Nowy_Katalog" -PassThru
Directory: C:\Temp\Archiwum
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 23/11/2025 15:21 Nowy_Katalog
Co tu się dzieje?
W tym przypadku Move-Item działa identycznie jak poprzednio, z tym, że pracujemy z katalogiem.
Szukasz szybkiego punktu odniesienia podczas pracy z PowerShellem? Wybierz Tablice informatyczne, czyli skondensowaną dawkę wiedzy, która zmieści się na każdym ekranie i ułatwi Twoją codzienną pracę.
Sprawdzanie zawartości katalogów
Sprawdzanie zawartości katalogów w PowerShellu opiera się głównie na Get-ChildItem (gci, dir, ls), które umożliwia pobieranie plików i podkatalogów z wybranej lokalizacji oraz analizowanie ich struktury. W praktyce pozwala to szybko ocenić, co znajduje się w danym katalogu, wykryć nieużywane zasoby, przygotować dane do raportowania albo zasilić kolejne etapy automatyzacji. Polecenie może działać zarówno na pojedynczym katalogu, jak i rekurencyjnie, dzięki czemu łatwo prześledzisz całe drzewo. Dodatkowo możesz stosować filtry i wzorce wyszukiwania, aby odnaleźć konkretne pliki lub katalogi, na przykład według rozszerzenia, części nazwy, typu lud daty. Dzięki temu PowerShell pozwala nie tylko przeglądać zasoby, ale również precyzyjnie wyłuskiwać te elementy, których aktualnie potrzebujesz.
Get-ChildItem
Lista wszystkich plików łącznie z podkatalogami:
PS C:\Users\Admin> Move-Item -Path "C:\Temp\Nowy_Katalog" -Destination "C:\Temp\Archiwum\Nowy_Katalog" -PassThru
Directory: C:\Temp\Archiwum
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 23/11/2025 15:21 Nowy_Katalog
PS C:\Users\Admin> Get-ChildItem -Path "C:\Temp" -Recurse
Directory: C:\Temp
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 23/11/2025 15:24 Archiwum
d----- 23/11/2025 15:22 Backup
Directory: C:\Temp\Archiwum
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 23/11/2025 15:21 Nowy_Katalog
-a---- 23/11/2025 15:20 35 Nowy_Plik.txt
Directory: C:\Temp\Archiwum\Nowy_Katalog
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 23/11/2025 15:21 26 plik1.txt
-a---- 23/11/2025 15:21 28 plik10.txt
-a---- 23/11/2025 15:21 26 plik2.txt
-a---- 23/11/2025 15:21 26 plik3.txt
-a---- 23/11/2025 15:21 26 plik4.txt
-a---- 23/11/2025 15:21 26 plik5.txt
-a---- 23/11/2025 15:21 26 plik6.txt
-a---- 23/11/2025 15:21 26 plik7.txt
-a---- 23/11/2025 15:21 26 plik8.txt
-a---- 23/11/2025 15:21 26 plik9.txt
Directory: C:\Temp\Backup
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 23/11/2025 15:22 Nowy_Katalog
-a---- 23/11/2025 15:20 35 Nowy_Plik.txt
Directory: C:\Temp\Backup\Nowy_Katalog
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 23/11/2025 15:21 26 plik1.txt
-a---- 23/11/2025 15:21 28 plik10.txt
-a---- 23/11/2025 15:21 26 plik2.txt
-a---- 23/11/2025 15:21 26 plik3.txt
-a---- 23/11/2025 15:21 26 plik4.txt
-a---- 23/11/2025 15:21 26 plik5.txt
-a---- 23/11/2025 15:21 26 plik6.txt
-a---- 23/11/2025 15:21 26 plik7.txt
-a---- 23/11/2025 15:21 26 plik8.txt
-a---- 23/11/2025 15:21 26 plik9.txt
Co tu się dzieje?
- Cmdlet
Get-ChildItempobiera elementy z wybranej lokalizacji systemu plików. - Parametr
-Path "C:\Temp"wskazuje katalog, od którego rozpoczyna się przeszukiwanie, w przypadku braku parametru polecenie domyślnie odczyta zawartość aktualnej lokalizacji. -Recursenakazuje przeszukiwać wszystkie podkatalogi w głąb struktury, dzięki czemu polecenie przechodzi przez całe drzewo katalogów podC:\Temp.- Wynik zwracany jest jako pełna lista wszystkich elementów znalezionych w katalogu głównym i jego podkatalogach.
Filtr tylko na pliki .txt:
PS C:\Users\Admin> Get-ChildItem -Path "C:\Temp" -Filter "*.txt" -Recurse
Directory: C:\Temp\Archiwum
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 23/11/2025 15:20 35 Nowy_Plik.txt
Directory: C:\Temp\Archiwum\Nowy_Katalog
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 23/11/2025 15:21 26 plik1.txt
-a---- 23/11/2025 15:21 28 plik10.txt
-a---- 23/11/2025 15:21 26 plik2.txt
-a---- 23/11/2025 15:21 26 plik3.txt
-a---- 23/11/2025 15:21 26 plik4.txt
-a---- 23/11/2025 15:21 26 plik5.txt
-a---- 23/11/2025 15:21 26 plik6.txt
-a---- 23/11/2025 15:21 26 plik7.txt
-a---- 23/11/2025 15:21 26 plik8.txt
-a---- 23/11/2025 15:21 26 plik9.txt
Directory: C:\Temp\Backup
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 23/11/2025 15:20 35 Nowy_Plik.txt
Directory: C:\Temp\Backup\Nowy_Katalog
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 23/11/2025 15:21 26 plik1.txt
-a---- 23/11/2025 15:21 28 plik10.txt
-a---- 23/11/2025 15:21 26 plik2.txt
-a---- 23/11/2025 15:21 26 plik3.txt
-a---- 23/11/2025 15:21 26 plik4.txt
-a---- 23/11/2025 15:21 26 plik5.txt
-a---- 23/11/2025 15:21 26 plik6.txt
-a---- 23/11/2025 15:21 26 plik7.txt
-a---- 23/11/2025 15:21 26 plik8.txt
-a---- 23/11/2025 15:21 26 plik9.txt
Co tu się dzieje?
- Początek polecenia działa identycznie jak poprzednio, tzn. wyświetlamy zawartość katalogu
C:\Tempi jego podkatalogów. - Parametr
-Filter "*.txt"odpowiada za ograniczenie wyników do plików spełniających podany wzorzec, w tym przypadku wszystkich plików z rozszerzeniem.txt. - Mamy tutaj do czynienia z tzw. filtrowaniem w lewo (od razu przy agregacji danych), co zapewnia szybsze działanie niż późniejsze filtrowanie w potoku.
Wyszukiwanie pustych katalogów:
PS C:\Users\Admin> Get-ChildItem -Path "C:\Temp" -Recurse -Directory |
Where-Object {$_.GetFiles().Count -eq 0 –and $_.GetDirectories().Count -eq 0 } |
Select-Object Fullname
FullName
--------
C:\Temp\Stary_Katalog
Co tu się dzieje?
- Podobnie jak poprzednio bazą naszego polecenia jest
Get-ChildItem. - Parametr
-Recurserozszerza działanie polecenia na wszystkie podkatalogi, parametr-Directoryfiltruje wynik tak, żeby zwrócone zostały tylko obiekty reprezentujące katalogi (nie pliki). - Następnie całość trafia do
Where-Object, gdzie dla każdego obiektu sprawdzane są dwa warunki:- metoda
GetFiles()sprawdza, czy liczba plików w tym katalogu jest równa zero, - metoda
GetDirectories()sprawdza, czy katalog nie zawiera żadnych podkatalogów.
- metoda
- Operator
-andłączy oba warunki logicznie, wymagając jednocześnie braku plików i braku podkatalogów. - Uzyskane wyniki trafiają do
Select-Object, gdzie wybieramy właściwośćFullName, dzięki czemu PowerShell wypisuje pełne ścieżki do katalogów spełniających kryterium (czyli pustych).
Usuwanie
Usuwanie plików w PowerShellu odbywa się za pomocą Remove-Item (remove, erase, rd, ri, rm lub rmdir), który pozwala kasować zarówno pojedyncze pliki, jak i całe katalogi. Podobnie jak poprzednio masz możliwość pracy na ścieżkach lokalnych i sieciowych. Możesz włączyć usuwanie rekurencyjne, aby usuwać katalogi wraz z całą zawartością. Dodatkowo aby zmniejszyć ryzyko błędów, PowerShell pozwala na stosowanie filtrów, potwierdzeń oraz trybów podglądu działania. Dzięki temu proces czyszczenia zasobów pozostaje kontrolowany, bezpieczny i łatwy do automatyzacji.
Remove-Item
Usuwanie pliku:
PS C:\Users\Admin> Remove-Item -Path "C:\Temp\Backup\Nowy_Plik.txt" -Verbose
VERBOSE: Performing the operation "Remove File" on target "C:\Temp\Backup\Nowy_Plik.txt".
Co tu się dzieje?
- Bazą polecenia jest cmdlet
Remove-Item, który wraz z parametrem-Pathokreśla dokładną ścieżkę do pliku, który ma zostać usunięty. - Następnie PowerShell weryfikuje, czy plik istnieje oraz czy bieżący użytkownik ma odpowiednie uprawnienia do jego usunięcia.
- Jeśli weryfikacja zakończy się pozytywnie, plik zostaje usunięty z systemu plików (operacja wykonywana jest natychmiastowo i nie przenosi pliku do Kosza).
- Domyślnie polecenie nie zwraca obiektu ani potwierdzenia wykonania, chyba że dodane zostaną opcjonalne parametry (np.
-Confirm,-Verbose).
Usuwanie wybranych plików:
PS C:\Users\Admin> Remove-Item -Path "C:\Temp\Archiwum\Nowy_Katalog\*.txt" -Confirm
Confirm
Are you sure you want to perform this action?
Performing the operation "Remove File" on target "C:\Temp\Archiwum\Nowy_Katalog\plik1.txt".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): y
Confirm
Are you sure you want to perform this action?
Performing the operation "Remove File" on target "C:\Temp\Archiwum\Nowy_Katalog\plik10.txt".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): y
Confirm
Are you sure you want to perform this action?
Performing the operation "Remove File" on target "C:\Temp\Archiwum\Nowy_Katalog\plik2.txt".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): y
Confirm
Are you sure you want to perform this action?
Performing the operation "Remove File" on target "C:\Temp\Archiwum\Nowy_Katalog\plik3.txt".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): y
Confirm
Are you sure you want to perform this action?
Performing the operation "Remove File" on target "C:\Temp\Archiwum\Nowy_Katalog\plik4.txt".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): y
Confirm
Are you sure you want to perform this action?
Performing the operation "Remove File" on target "C:\Temp\Archiwum\Nowy_Katalog\plik5.txt".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): y
Confirm
Are you sure you want to perform this action?
Performing the operation "Remove File" on target "C:\Temp\Archiwum\Nowy_Katalog\plik6.txt".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): y
Confirm
Are you sure you want to perform this action?
Performing the operation "Remove File" on target "C:\Temp\Archiwum\Nowy_Katalog\plik7.txt".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): y
Confirm
Are you sure you want to perform this action?
Performing the operation "Remove File" on target "C:\Temp\Archiwum\Nowy_Katalog\plik8.txt".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): y
Confirm
Are you sure you want to perform this action?
Performing the operation "Remove File" on target "C:\Temp\Archiwum\Nowy_Katalog\plik9.txt".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"): y
Co tu się dzieje?
- Podobnie jak poprzednio korzystamy z
Remove-Item. - Tym razem jako wartość parametru
-Pathzastosowałem docelową ścieżkę ze znakiem wildcard*.txt, czyli wskazuję wszystkie pliki tekstowe. - Na zakończenie parametr wspólny
-Confirm, który dodatkowo zabezpiecza przez przypadkowym usunięciem i wyświetla monit dotyczący każdego pliku.
Usuwanie katalogu wraz z całą zawartością:
PS C:\Users\Admin> Remove-Item -Path "C:\Temp\Backup" -Recurse -Verbose
VERBOSE: Performing the operation "Remove Directory" on target "C:\Temp\Backup".
VERBOSE: Performing the operation "Remove Directory" on target "C:\Temp\Backup\Nowy_Katalog".
VERBOSE: Performing the operation "Remove File" on target "C:\Temp\Backup\Nowy_Katalog\plik1.txt".
VERBOSE: Performing the operation "Remove File" on target "C:\Temp\Backup\Nowy_Katalog\plik10.txt".
VERBOSE: Performing the operation "Remove File" on target "C:\Temp\Backup\Nowy_Katalog\plik2.txt".
VERBOSE: Performing the operation "Remove File" on target "C:\Temp\Backup\Nowy_Katalog\plik3.txt".
VERBOSE: Performing the operation "Remove File" on target "C:\Temp\Backup\Nowy_Katalog\plik4.txt".
VERBOSE: Performing the operation "Remove File" on target "C:\Temp\Backup\Nowy_Katalog\plik5.txt".
VERBOSE: Performing the operation "Remove File" on target "C:\Temp\Backup\Nowy_Katalog\plik6.txt".
VERBOSE: Performing the operation "Remove File" on target "C:\Temp\Backup\Nowy_Katalog\plik7.txt".
VERBOSE: Performing the operation "Remove File" on target "C:\Temp\Backup\Nowy_Katalog\plik8.txt".
VERBOSE: Performing the operation "Remove File" on target "C:\Temp\Backup\Nowy_Katalog\plik9.txt".
Co tu się dzieje?
- W celu usunięcia katalogu z całą zawartością stosujemy parametr
-Recurse. - Dodatkowo dla zobrazowania co sie dzieje dodałem
-Verbose.
Dobre praktyki
Efektywna i bezpieczna praca z plikami oraz katalogami w PowerShell wymaga czegoś więcej niż znajomości pojedynczych poleceń. To obszar, w którym precyzja, kontrola błędów i świadome podejście do operacji mają kluczowe znaczenie. Dobre praktyki pozwalają tworzyć skrypty odporne na błędy, przewidywalne w działaniu i łatwe do utrzymania w środowiskach produkcyjnych. Poniższe zasady stanowią fundament pracy z systemem plików w PowerShell i warto trzymać się ich przy tworzeniu automatyzacji:
- Pracuj na obiektach PowerShell, korzystając z właściwości plików i katalogów zamiast parsowania tekstu.
- Stosuj pełne ścieżki, szczególnie w skryptach produkcyjnych.
- Waliduj istnienie plików i katalogów przed wykonaniem operacji takich jak usuwanie, przenoszenie czy kopiowanie.
- Używaj parametrów
-Recursei-Forceostrożnie, mając pełną świadomość ich zasięgu i konsekwencji. - Testuj destrukcyjne operacje (usuwanie/przenoszenie) za pomocą
-WhatIflub-Confirm, zanim trafią do środowiska produkcyjnego. - Loguj kluczowe operacje, aby mieć historię zmian i ułatwić audyt oraz diagnostykę.
- Stosuj
try/catchprzy operacjach na plikach, aby kontrolować błędy i prowadzić przewidywalne zachowanie skryptu. - Filtruj dane w pipeline, wykorzystując właściwości obiektów do precyzyjnego wyboru plików.
- Unikaj usuwania wyłącznie na podstawie rozszerzeń, staraj się dodawać dodatkowe kryteria, np. datę lub rozmiar.
- Zamykaj powtarzalne operacje w funkcjach, aby zwiększyć czytelność i możliwość ponownego wykorzystania kodu. Więcej o funkcjach -> Twoje własne polecenia, czyli pierwsza funkcja w PowerShellu
- Przy dużych operacjach stosuj wstępne pomiary (np. liczba plików, rozmiar), aby przewidzieć czas wykonania i obciążenie.
- Standaryzuj nazwy plików i kontroluj długość ścieżek, aby uniknąć problemów z kompatybilnością i kodowaniem.
Podsumowanie
Praca z plikami i katalogami w PowerShellu to zwykle szybki, wygodny i co najważniejsze w pełni automatyzowalny obszar. Obszar, w którym nawet proste polecenia potrafią znacząco skrócić czas pracy i wyeliminować błędy wynikające z ręcznej obsługi. Naukę warto zacząć od podstaw: utwórz kilka testowych plików, wykonaj ich kopiowanie, przenoszenie oraz usuwanie, aby zrozumieć, jak PowerShell interpretuje ścieżki i jak zachowują się poszczególne parametry. Następnie przejdź do bardziej praktycznych scenariuszy, takich jak prosty mechanizm backupu, automatyczne porządkowanie plików i katalogów czy archiwizacja logów według daty. Takie ćwiczenia pozwalają wypracować pewne nawyki, które później przekładają się na tworzenie stabilnych, powtarzalnych i skalowalnych procesów automatyzacji w środowisku produkcyjnym.
Dla chętnych
Napisz skrypt, który:
- Poprosi użytkownika o podanie ścieżki do katalogu.
- Sprawdzi, czy katalog istnieje.
- Jeśli istnieje to utworzy archiwum ZIP z całą jego zawartością.
- Nazwa archiwum powinna zawierać nazwę katalogu oraz aktualną datę (np.
2025-11-23.zip). - Jeśli katalog nie istnieje – wyświetli czytelny komunikat błędu.
Przykładowe rozwiązanie
# 1. Pobranie ścieżki od użytkownika
$Path = Read-Host "Podaj pełną ścieżkę do katalogu, który chcesz zarchiwizować"
# 2. Walidacja istnienia katalogu
if (-not (Test-Path $Path)) {
Write-Warning "Katalog '$Path' nie istnieje. Sprawdź ścieżkę i spróbuj ponownie."
return
}
# 3. Przygotowanie nazwy archiwum
$FolderName = Split-Path $Path -Leaf
$Date = Get-Date -Format "yyyy-MM-dd"
$ArchiveName = "${FolderName}_${Date}.zip"
# 4. Utworzenie archiwum ZIP
try {
Compress-Archive -Path $Path\* -DestinationPath $ArchiveName -Force
Write-Output "Archiwum utworzone: $ArchiveName"
}
catch {
Write-Error "Nie udało się utworzyć archiwum: $_"
}
Co tu się dzieje?
Na początek pobieramy od użytkownika ścieżkę do katalogu, korzystając z polecenia Read-Host i zapisujemy do zmiennej $Path
Następnie sprawdzamy, czy wskazany katalog istnieje, używając Test-Path. Jeśli katalog nie istnieje, wypisuje ostrzeżenie i kończy działanie skryptu. Jeżeli istnieje to pobieramy jego nazwę z pełnej ścieżki za pomocą Split-Path -Leaf
Za pomocą Get-Date tworzymy datę w formacie yyyy-MM-dd, aby użyć jej w nazwie archiwum
Budujemy nazwę pliku ZIP z wykorzystaniem nazwy katalogu i daty
Korzystamy z bloku try, aby bezpiecznie utworzyć archiwum ZIP
Do spakowania zawartości posłużymy się cmdletem Compress-Archive
Po udanej kompresji pojawia się komunikat potwierdzający utworzenie archiwum
Jeśli podczas kompresji wystąpi błąd, przechodzimy do bloku catch i wyświetlana jest informację o błędzie
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
Administrator | Trener i autor szkoleń | Entuzjasta PowerShellaAdministrator systemów i sieci wsparcia działań wojskowych z ponad 10-letnim doświadczeniem. Praktyk w dziedzinie zarządzania Active Directory, bezpieczeństwa systemu Windows oraz automatyzacji zadań (PowerShell). 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.


