Cześć, witaj z ponownie. Ostatnio rozmawialiśmy o tworzeniu własnych funkcji. Po ich wdrożeniu Twój kod stał się modularny i nieco bardziej uporządkowany. Dziś sprawimy, że stanie się jeszcze potężniejszy. Proste kilku liniowe skrypty wyposażymy w inteligencję i moc decyzyjną. Odkryjesz, jak dzięki pętlom i instrukcjom warunkowym zmienisz listę komend w prawdziwie inteligentny system automatyzacji. Jesteś gotów, by zacząć pisać kod, który nie tylko działa, ale myśli? W takim razie do dzieła!
Dlaczego Twój kod powinien myśleć?
W świecie PowerShella, w którym automatyzacja odgrywa kluczową rolę, sama znajomość podstawowych poleceń to za mało. Skrypty, które tylko wykonują określone zadania jedno po drugim, szybko osiągają swoje ograniczenia. Prawdziwa siła PowerShella ujawnia się dopiero wtedy, gdy potrafisz sprawić, by Twój kod reagował na konkretną sytuację, podejmował decyzje i działał tak elastycznie jakby sam rozumiał, co się dzieje.
Po co to wszystko? Bo w świecie automatyzacji nie chodzi o ślepe wykonywanie poleceń, ale o tworzenie rozwiązań, które potrafią analizować warunki, wyciągać wnioski i działać odpowiednio do kontekstu. Dopiero wtedy PowerShell staje się narzędziem, które naprawdę pracuje za Ciebie, a nie tylko wykonuje Twoje instrukcje.
Czym są pętle i warunki?
Pętle i warunki to podstawowe mechanizmy sterowania przepływem w PowerShellu. To właśnie one decydują, które fragmenty kodu zostaną wykonane, w jakiej kolejności oraz w jakich okolicznościach. Dzięki nim skrypt potrafi reagować dynamicznie dostosowując się do zmieniających się danych wejściowych lub warunków działania.
Instrukcje warunkowe pozwalają podejmować decyzje w zależności od tego, co się dzieje. Skrypt może sprawdzić określony warunek (np. czy plik istnieje, czy wartość jest większa od zera) i na tej podstawie wykonać odpowiednie polecenia.
Pętle natomiast służą do powtarzania tych samych działań wiele razy aż do momentu spełnienia określonego kryterium lub przetworzenia całego zestawu danych.
W połączeniu tworzą elastyczny mechanizm, który sprawia, że skrypty PowerShella mogą reagować inteligentnie i automatyzować nawet złożone procesy.
W skrócie:
| Cecha | Instrukcje warunkowe | Pętle |
|---|---|---|
| Cel | Decydują, czy dany fragment kodu zostanie wykonany | Powodują, że fragment kodu wykonuje się wielokrotnie |
| Zasada działania | Kod uruchamia się, jeśli warunek logiczny jest spełniony | Kod uruchamia się wielokrotnie, dopóki warunek jest spełniony lub dopóki są elementy do przetworzenia |
| Kiedy stosować | Gdy chcemy, aby program reagował na różne sytuacje lub dane wejściowe | Gdy chcemy automatyzować powtarzalne operacje lub przetwarzać wiele elementów |
| Efekt | Steruje ścieżką wykonania programu (wybór co ma się stać) | Steruje powtarzaniem operacji (ile razy ma się coś stać) |
Instrukcje warunkowe, czyli podejmowanie decyzji
Najprostszy sposób tworzenia logiki w PowerShellu to użycie instrukcji warunkowej.
Podstawowy szablon:
If (Warunek1) {
Warunek1 został spełniony.
} elseif (Warunek2) {
Warunek2 został spełniony.
} else {
Żaden warunek nie został spełniony.
}
Jeżeli Warunek1 zostanie spełniony (czyli jego wartość logiczna to $true), wykonany zostanie kod znajdujący się w pierwszych nawiasach klamrowych { }. Jeśli Warunek1 nie zostanie spełniony, PowerShell sprawdzi Warunek2. Gdy ten okaże się prawdziwy, uruchomiony zostanie kod przypisany do tego warunku. W przeciwnym razie (gdy żaden warunek nie jest spełniony) wykona się kod z ostatniego bloku { }. Teraz spójrzmy na przykład z praktyki:
$liczba=3
if ($liczba -gt 10) {
Write-Output "Wartość $liczba jest większa niż 10."
} elseif ($liczba -eq 10) {
Write-Output "Wartość $liczba jest równa 10."
} else {
Write-Output "Wartość $liczba jest mniejsza niż 10."
}
Jak to działa?
- Na początek deklarujemy zmienną
$liczbai przypisujemy jej wartość 3 - Następnie instrukcja warunkowa
ifsprawdza pierwszy warunek - W tym przykładzie PowerShell sprawdza, czy nasza zmienna jest większa niż 10
- Jeśli warunek jest prawdziwy, wykonuje się kod wewnątrz pierwszego bloku
{ } - Jeśli nie, PowerShell przechodzi do
elseifi sprawdza, czy$liczbajest równe 10 - Jeśli to również nie jest prawda, wykonuje się część
else(tzw. „domyślna” akcja – wykonuje się wtedy, gdy żaden wcześniejszy warunek nie został spełniony)
Wykonaj ten fragment kodu i zobacz, co otrzymałeś. W moim przypadku:
Wartość 3 jest mniejsza niż 10.
A zatem wszystko zgodnie z planem.
💡 Warto wiedzieć
- Warunki są sprawdzane po kolei:
if→elseif→else- Wykonywany jest tylko pierwszy blok, którego warunek zwróci
true- Możesz mieć wiele
elseif, ale tylko jednoelse
Operatory porównania
Istotnym elementem każdej instrukcji warunkowej są operatory porównania. Generalnie służą one do sprawdzania relacji między dwiema wartościami. Każdy z nich zwraca wynik logiczny (True lub False), w zależności od tego, czy dane porównanie jest prawdziwe. Są one podstawą instrukcji warunkowych, bo to właśnie na ich wynikach program podejmuje decyzje np. czy wykonać dany blok kodu w if, elseif albo else. Poniżej najczęściej używane operatory porównania:
| Operator | Znaczenie | Przykład | Wynik |
|---|---|---|---|
-eq | Równe (equal) | 5 -eq 5 | True |
-ne | Różne (not equal) | 10 -ne 3 | True |
-gt | Większe niż (greater than) | 8 -gt 5 | True |
-lt | Mniejsze niż (less than) | 2 -lt 7 | True |
-ge | Większe lub równe (greater or equal) | 5 -ge 5 | True |
-le | Mniejsze lub równe (less or equal) | 4 -le 6 | True |
Instrukcja warunkowa switch
Instrukcja switch służy do sprawdzania wartości zmiennej względem wielu możliwych przypadków. Zamiast pisać długiego ciągu if / elseif, możesz przejrzyściej i szybciej obsłużyć różne warianty. PowerShell sprawdza po kolei każdy przypadek, a jeśli znajdzie dopasowanie, wykonuje odpowiadający mu blok kodu. Podstawowy szablon przedstawia się następująco:
switch (<wyrażenie>) {
<wartość1> { <blok kodu> }
<wartość2> { <blok kodu> }
Default { <blok kodu domyślny> }
}
💡 Warto wiedzieć
- Klauzula
Defaulturuchamia się, gdy żaden inny przypadek nie pasuje- Porównania domyślnie są niezależne od wielkości liter (case-insensitive)
- Możesz też używać wzorców (
-like,-match) zamiast dosłownych wartości
Zobaczmy teraz jakiś praktyczny przykład:
$day = (Get-Date).DayOfWeek
switch ($day) {
"Monday" { Write-Host "Początek tygodnia" }
"Friday" { Write-Host "Prawie weekend!" }
"Saturday" { Write-Host "Weekend" }
"Sunday" { Write-Host "Odpoczynek" }
Default { Write-Host "Zwykły dzień" }
}
Jak to działa?
- W pierwszej kolejności deklarujemy zmienną $day i przypisujemy jej wartość aktualnego dnia korzystając z cmdletu Get-Date i jego właściwości
- Następnie wykonujemy naszą instrukcję switch.
W zależnosci od aktualnego dnia uzyskamy inny wynik. Przykładowo dziś mamy czwartek, a zatem wynik będzie prezentował się następująco:
Zwykły dzień
Najczęstsze zastosowania:
- Menu wyboru w skryptach interaktywnych (np. użytkownik wybiera opcję z listy)
- Obsługa różnych stanów lub komunikatów (np. statusy, błędy, dni tygodnia)
- Dopasowanie wzorców przy analizie tekstu lub logów (
-like,-regex) - Mapowanie danych (np. kody → nazwy, skróty → pełne opisy)
Operator trójargumentowy (ternary operator) w PowerShell 7
Jeśli korzystasz z PowerShell 7, możesz spotkać się z tzw. operatorem trójargumentowym. Pozwala on zapisać prostą decyzję w jednej linijce, zamiast używać klasycznego if/else. Poniżej przykładowy zapis:
Wwynik = Warunek ? "True" : "False"
Jak to działa?
?oznacza „jeśli warunek jest prawdziwy”:oznacza „jeśli warunek jest fałszywy”
Czyli w jednym wierszu robimy dokładnie to samo, co w całym bloku if/else.
W praktyce może to wyglądać np. tak:
$wiek = Read-Host
$status = ($wiek -ge 18) ? "Pełnoletnia" : "Niepełnoletnia"
Write-Host "Osoba jest: $status"
Jak to działa?
- Na początek zmienna wiek i cmdlet Read-Host, dzięki czemu będziesz w stanie podać konkretny wiek
- Następnie operator sprawdza warunek i w zależności od wyniku podaję konkretną informacje
W moim przypadku po podaniu wieku 10, otrzymałem:
PS C:\Users\Admin> $wiek = Read-Host
10
PS C:\Users\Admin> $status = ($wiek -ge 18) ? "Pełnoletnia" : "Niepełnoletnia"
PS C:\Users\Admin> Write-Host "Osoba jest: $status"
Osoba jest: Niepełnoletnia
Kiedy używać operatora trójargumentowego?
- Gdy chcesz skrócić kod i zwiększyć jego czytelność
- Gdy warunek jest prosty i mieści się w jednej linijce
- Unikaj go przy złożonej logice – wtedy lepiej użyć klasycznego
if/else
To bardzo przydatne narzędzie, które warto znać. Nie zawsze zastąpi if, ale często pozwoli Ci pisać kod szybciej i czytelniej.
Pętle – czyli powtarzanie działań
Pętla:for
W PowerShellu pętla for pozwala na wykonywanie bloku kodu wielokrotnie przez określoną liczbę razy, kontrolując iteracje za pomocą licznika, warunku kontynuacji oraz instrukcji zmieniającej wartość tego licznika. Jest to idealny wybór, gdy znasz lub możesz określić z góry, ile razy dany fragment kodu ma zostać wykonany. Przykładowo aby stworzyć 5 testowych katalogów skorzystaj z poniższego kodu:
#Deklaracja zmiennej Path
$Path = "C:\Test"
for ($i = 1; $i -le 5; $i++) {
New-Item -Path $Path -Name "Katalog_$i" -ItemType Directory
Write-Host "Utworzono Katalog_$i"
}
Jak to działa?
- Na początek deklaracja zmiennej
$Path, której przypisujemy wartość"C:\Test", co określa lokalizację, w której będą tworzone nowe katalogi (katalog ten musi oczywiście istnieć) - Następnie pętla
forinicjuje zmienną licznika$ina wartość 1 i sprawdza, czy warunek kontynuacji jest spełniony - Przy każdym przejściu pętli (od $i=1 do $i=5), polecenie
New-Itemtworzy nowy katalog w zdefiniowanej ścieżce, dynamicznie nadając mu nazwę"Katalog_"połączoną z aktualną wartością licznika$i - Po utworzeniu każdego katalogu, na konsoli wyświetlany jest komunikat potwierdzający, a następnie licznik
$ijest zwiększany o jeden, przygotowując pętlę do następnego wykonania - Pętla kończy działanie, gdy
$iosiągnie wartość 6, ponieważ warunek$i -le 5przestaje być spełniony, efektywnie tworząc pięć kolejnych katalogów
Kiedy używać pętli for?
- Kiedy potrzebujesz wykonać tę samą operację stałą liczbę razy (np. dokładnie 20 razy).
- Kiedy chcesz przetwarzać lub generować dane w ustalonym zakresie numerycznym (np. od 50 do 1000).
- Choć w PowerShellu do iteracji przez elementy tablic częściej używa się
foreachlub operatora potokowego (|), pętlaforjest konieczna, gdy potrzebujesz dostępu do indeksu ($i) lub chcesz przetwarzać tablicę w odwrotnej kolejności.
Pętlaforeach
W PowerShellu służy do przetwarzania kolekcji obiektów (takich jak tablice, listy plików, wyniki poleceń cmdlet), wykonując blok kodu jeden raz dla każdego elementu z tej kolekcji. Jest to najczęściej używana pętla w PowerShellu, ponieważ natywnie współpracuje z danymi wyjściowymi innych poleceń. W przeciwieństwie do pętli for, która bazuje na licznikach, foreach bazuje na liście elementów, które ma przetworzyć.
Poniżej podobny przykład z tworzeniem 5 katalogów z wykorzystaniem pętli foreach.
$NoweKatalogi = @("1", "2", "3", "4", "5")
foreach ($Katalog in $NoweKatalogi) {
New-Item -Path C:\Test -Name "Katalog_$katalog" -ItemType Directory
Write-Host "Utworzono katalog: Katalog_$Katalog"
}
Jak to działa?
- Na początek deklaracja dwóch zmiennych, które odpowiedzialne są za docelową ścieżkę oraz kolekcję elementów (katalogów)
- Następnie pętla
foreachbierze kolejno każdy element z listy $NoweKatalogi i dla każdego z nich tworzy nowy katalog oraz wyświetla komunikat
Kiedy używać pętli foreach?
- Kiedy wykonujesz akcje na każdym elemencie zwróconym przez inne polecenie, na przykład zatrzymując każdą usługę na liście zwróconej przez
Get-Service - Kiedy przetwarzasz predefiniowaną listę wartości, takich jak nazwy komputerów lub użytkowników, aby wykonać na każdej z nich operację
- kiedy wykonujesz operacje na każdym pliku lub katalogu, przykładowo zmieniając rozszerzenie wszystkich plików
.tmpna.old.
Pętla:while
Pętla while w PowerShellu wykonuje blok kodu tak długo, jak określony warunek pozostaje prawdziwy (True), a warunek ten jest sprawdzany przed każdym wykonaniem bloku kodu. Stosuje się ją, gdy nie jest z góry wiadome, ile razy pętla ma się wykonać, a jej zakończenie zależy od dynamicznie zmieniającego się stanu. Pętla while jest zazwyczaj używana w kontekście licznika, podobnie jak for, ale gdy zależy nam na większej kontroli nad samym warunkiem końcowym. Poniżej przykładowy kod z naszego przykładu z katalogami:
$i = 1
while ($i -le 5) {
New-Item -Path C:\Test -Name "Katalog_$i" -ItemType Directory
Write-Host "Utworzono: Katalog_$i"
$i++
}
Jak to działa?
- W poczatkowej fazie deklarujemy zmienną
i(licznik) orazPath(ścieżka docelowa) - Następnie pętla while przy każdej iteracji sprawdza czy warunek jest spełniony, tzn. czy zmienna i jest zmniejsza od 5
- jeżeli warunek jest prawdziwy wykonywane są dalsze instrukcje, czyli utworzenie katalogu i wyświetlenie komunikatu
Kiedy używać pętli while?
- Kiedy chcesz powtarzać określoną akcję, dopóki warunek logiczny pozostaje spełniony, na przykład zwiększając licznik, dopóki nie osiągnie określonej wartości.
- Kiedy oczekujesz na spełnienie warunku, na przykład dopóki nie pojawi się określony plik w katalogu lub nie zostanie utworzony zasób w systemie.
- Kiedy monitorujesz stan usługi lub procesu i chcesz reagować, dopóki nie osiągnie oczekiwanego statusu.
- Kiedy losujesz lub pobierasz dane w pętli, dopóki nie zostanie uzyskany właściwy wynik.
- Kiedy chcesz utrzymać interakcję z użytkownikiem, dopóki nie wprowadzi konkretnej komendy, na przykład „exit” w konsoli.
Cmdlet ForEach-Object
Cmdlet ForEach-Object (znany także jako alias % lub foreach w kontekście potoku) w PowerShellu służy do wykonywania bloku kodu na każdym elemencie, który wpłynie do niego potokiem (pipe). W przeciwieństwie do standardowej pętli foreach, która działa na gotowej kolekcji, ForEach-Object przetwarza obiekty strumieniowo, co jest kluczowe dla efektywności i zarządzania pamięcią przy pracy z dużymi zbiorami danych.
Przykład:
1..5 | ForEach-Object {
New-Item -Path $Path -Name "Katalog_$_" -ItemType Directory
Write-Host "Utworzono: Katalog_$_"
}
Jak to działa?
ForEach-Objectpobiera każdy element z potoku (wygenerowany za pomocą operatora zakresu1..5)New-Itemtworzy katalog w podanej ścieżce (parametr -Path) z określoną nazwą (parametr -Name)- zmienna
$_reprezentuje bieżący element (czyli koleny numer) Write-Hostinformuje użytkownika o postępie działania
Kiedy używać cmdletu ForEach-Object?
- Kiedy przetwarzasz dane przekazywane przez potok
- Gdy chcesz masowo zmieniać właściwości obiektów (np. usługi, procesy, użytkownicy)
- Kiedy przetwarzasz dane z plików tekstowych lub CSV lub generujesz raporty na podstawie danych wejściowych
- Podczas procesu filtrowania lub formatowania danych w trakcie przepływu potoku
- Kiedy chcesz tworzyć proste automatyzacje bez potrzeby stosowania klasycznej pętli
foreach
Dodatkowe instrukcje sterujące
W PowerShellu w pętlach można stosować dodatkowe instrukcje sterujące, takie jak break, continue czy return, które pozwalają precyzyjnie kontrolować przebieg wykonywania kodu. Instrukcja break natychmiast przerywa działanie całej pętli, niezależnie od tego, czy warunek został spełniony. Z kolei continue powoduje pominięcie bieżącej iteracji i przejście do następnej, co jest przydatne, gdy chcesz pominąć określone przypadki bez kończenia pętli. W bardziej złożonych skryptach można również używać return do zakończenia działania całej funkcji lub skryptu w momencie spełnienia danego warunku. Dzięki tym mechanizmom pętle w PowerShellu stają się bardziej elastyczne i pozwalają na tworzenie czytelnych, kontrolowanych przepływów logiki.
Przykład pokazujący użycie break i continue w pętli:
for ($i = 1; $i -le 10; $i++) {
if ($i -eq 3) {
Write-Host "Pominięto wartość 3"
continue # pomija tę iterację i przechodzi do następnej
}
if ($i -eq 7) {
Write-Host "Zatrzymano pętlę przy wartości 7"
break # przerywa całą pętlę
}
Write-Host "Aktualna wartość: $i"
}
Jak to działa?
- Skrypt wypisuje kolejne liczby od 1 do 10
- Gdy
$irówna się3, użyciecontinuepowoduje pominięcie tej liczby - Gdy
$iosiąga7, instrukcjabreakzatrzymuje całą pętlę - Dzięki temu pętla kończy się wcześniej, a kod pozostaje czytelny i kontrolowany
Kiedy stosować dodatkowe instrukcje sterujące?
- Zakończenie pętli wcześniej (
break) – gdy chcesz przerwać wykonywanie pętli po spełnieniu określonego warunku (np. znalezieniu poszukiwanego elementu) - Pominięcie pojedynczej iteracji (
continue) – gdy chcesz przejść do następnego obrotu pętli, pomijając aktualny element (np. przy filtracji danych) - Zakończenie działania funkcji lub skryptu (
return) – gdy w trakcie iteracji chcesz natychmiast zakończyć funkcję i zwrócić wynik - Sterowanie zagnieżdżonymi pętlami – gdy w strukturze wielopoziomowej musisz określić, z której pętli chcesz wyjść (np.
breakprzerywa tylko bieżący poziom) - Obsługa wyjątkowych przypadków lub błędów – gdy pojawia się nieoczekowana sytuacja i dalsze wykonywanie pętli nie ma sensu
- Optymalizacja działania – gdy chcesz uniknąć zbędnego przetwarzania elementów, które nie spełniają warunku, skracając czas wykonania skryptu
Porównanie pętli
| Pętla / Cmdlet | Kiedy Stosować? | Kluczowa Cecha | Typowe Zastosowanie |
for | Gdy dokładnie wiesz, ile razy ma się wykonać kod (np. 10 razy) | Oparta na liczniku, warunku i kroku ($i++) | Testowanie, generowanie dużej liczby testowych danych lub iteracja przez indeks tablicy |
foreach | Gdy masz gotową, w pełni załadowaną kolekcję (tablicę, listę) i chcesz przetworzyć każdy jej element | Działa na kolekcji w pamięci; używa zmiennej do przechowywania bieżącego elementu | Przetwarzanie listy nazw użytkowników, ścieżek plików, predefiniowanych ustawień |
while | Gdy nie wiesz z góry, ile razy pętla ma się wykonać, a jej zakończenie zależy od zmieniającego się warunku | Wykonuje kod tak długo, jak warunek jest PRAWIDZIWY; wymaga ręcznej kontroli warunku końcowego | Monitorowanie stanu (np. czekanie, aż usługa się uruchomi), pobieranie stron z API |
ForEach-Object | Gdy przetwarzasz duże zbiory danych lub wyniki z potoku i chcesz oszczędzać pamię | Działa strumieniowo (obiekt po obiekcie); bieżący element to automatyczna zmienna $_ | filtrowanie, modyfikowanie lub wykonywanie akcji na wynikach innych poleceń w potoku |
Łączenie pętli i warunków
W PowerShellu pętle i instrukcje warunkowe często występują razem, ponieważ pozwalają tworzyć bardziej elastyczne i inteligentne skrypty. Instrukcje warunkowe, takie jak if, elseif i else, umożliwiają podejmowanie decyzji wewnątrz pętli – na przykład wykonywanie różnych akcji w zależności od stanu obiektu lub wyniku operacji. Dzięki temu w jednej pętli można nie tylko przetwarzać wiele elementów, ale też reagować dynamicznie na różne sytuacje, np. zatrzymać pętlę po spełnieniu określonego warunku (break) albo pominąć bieżący element (continue). Takie połączenie jest szczególnie przydatne w administracji systemami, gdzie skrypt musi sprawdzać warunki i reagować w czasie rzeczywistym, np. monitorując usługi, pliki lub procesy.
Przykład: Sprawdzenie wolnego miejsca na dyskach
$drives = Get-PSDrive -PSProvider 'FileSystem'
foreach ($drive in $drives) {
if ($drive.Free -lt 1GB) {
Write-Output "Uwaga: mało miejsca na dysku $($drive.Name)"
} else {
Write-Output "Dysk $($drive.Name) ma wystarczająco dużo miejsca."
}
}
Jak to działa?
- Pobieramy listę wszystkich dysków posiadających system plików (cmdlet
GetPsDrive) i przypisujemy do zmiennej$drivers - Następnie za pomocą pętli
foreachoraz instrukcji warunkowejif..elsedla każdego z nich sprawdzamy ilość wolnego miejsca - Jeśli wolna przestrzeń stanowi mniej niż 1 GB, wyświetlone zostanie ostrzeżenie
Podsumowanie
Instrukcje warunkowe i pętle w PowerShellu umożliwiają kontrolowanie logiki skryptu, czyli pozwalają decydować, kiedy i ile razy wykona się dany fragment kodu. Warunki (if, elseif, else) służą do podejmowania decyzji, a pętle (for, foreach, while, do-while) do powtarzania operacji. Dodatkowe instrukcje, takie jak break i continue, dają pełną kontrolę nad przebiegiem pętli. Razem stanowią fundament automatyzacji i inteligentnego sterowania działaniem skryptów.
Praca domowa
Napisz skrypt, który:
- pyta użytkownika o liczbę (
Read-Host), - a następnie w pętli
whilewypisuje wszystkie liczby od 1 do tej wartości.
Dodaj warunek, że jeśli liczba jest podzielna przez 3, skrypt wypisze tekst:"Ta liczba jest podzielna przez 3"
zamiast samej liczby.
Rozszerz skrypt, aby:
- zakończył działanie pętli przy wartości
10(użyjbreak). - pominął wartość
5(użyjcontinue),
Dla chętnych:
Spróbuj napisać tę samą logikę z użyciem pętli for i foreach, aby porównać działanie każdej z nich.
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.

