1PowerShell dla początkujących

Witaj w kursie PowerShell!

PowerShell to zaawansowane narzędzie do automatyzacji zadań w systemach Windows, stworzone przez Microsoft. W tym kursie poznasz podstawy PowerShell od zera, krok po kroku.

Co znajdziesz w tym kursie?

  • Podstawowe pojęcia i terminologia
  • Jak działa PowerShell
  • Pisanie własnych skryptów
  • Praca z plikami i folderami
  • Automatyzacja powtarzalnych zadań
Wskazówka: PowerShell jest dostępny nie tylko w Windowsie, ale także w Linuxie i macOS. Umiejętności, które zdobędziesz, będą przydatne na wielu platformach!

PowerShell to zaawansowane narzędzie automatyzacji i zarządzania konfiguracją, które wykracza daleko poza możliwości tradycyjnych powłok systemowych. Jego architektura oparta na platformie .NET pozwala na operowanie na obiektach, a nie na tekście, co stanowi fundamentalną różnicę w porównaniu z CMD czy BASH. Dzięki temu programiści i administratorzy mogą w prosty sposób przetwarzać dane, filtrować wyniki i przekazywać je między poleceniami bez konieczności pisania skomplikowanych wyrażeń regularnych. W kursie tym krok po kroku poznasz składnię języka, mechanizmy potoku oraz praktyczne zastosowania PowerShell w codziennej administracji. Niezależnie od tego, czy jesteś początkującym administratorem, czy doświadczonym specjalistą IT, PowerShell dostarcza narzędzi, które znacząco przyspieszają realizację zadań związanych z obsługą systemu Windows, Linux czy macOS.

Współczesne środowisko IT wymaga od specjalistów umiejętności pracy z wieloma platformami jednocześnie. PowerShell jako narzędzie multiplatformowe pozwala na ujednolicenie procesów zarządczych bez względu na system operacyjny, co przekłada się na redukcję kosztów utrzymania infrastruktury. W trakcie kursu zwrócimy uwagę nie tylko na teorię, ale przede wszystkim na praktyczne przykłady, które możesz od razu wykorzystać w swojej codziennej pracy.

2Co to jest PowerShell?

Definicja

PowerShell to nowoczesna powłoka poleceń (command shell) i język skryptowy stworzony przez Microsoft. Jest to znacznie więcej niż zwykły wiersz poleceń.

Trzy twarze PowerShell

  • Interaktywna powłoka - wpisujesz polecenia i natychmiast otrzymujesz wyniki
  • Język skryptowy - możesz pisać pliki z poleceniami do późniejszego wykonania
  • Platforma automatyzacji - zarządza systemem operacyjnym i aplikacjami

Kluczowa różnica

W przeciwieństwie do tradycyjnego CMD czy BASH, PowerShell nie operuje na tekście, lecz na obiektach. To sprawia, że praca z danymi jest znacznie łatwiejsza.

PowerShell został stworzony przez Microsoft jako odpowiedź na rosnące zapotrzebowanie na zaawansowane narzędzie do zarządzania systemami Windows. W przeciwieństwie do starszej powłoki CMD, PowerShell od samego początku projektowany był z myślą o automatyzacji i pracy z obiektami. Każde polecenie w PowerShell zwraca obiekt, a nie tekst, co eliminuje konieczność uciążliwego parsowania wyników za pomocą narzędzi takich jak findstr czy awk. Dzięki temu administrator może w prosty sposób przechwycić wynik jednego polecenia i przekazać go do następnego, wykorzystując przy tym pełnię możliwości platformy .NET.

Interaktywna powłoka pozwala na bieżące testowanie poleceń i eksperymentowanie z kodem w trybie rzeczywistym, co znacznie przyspiesza proces nauki i debugowania. Język skryptowy PowerShell stanowi przy tym rozszerzenie składniowe, które umożliwia tworzenie rozbudowanych skryptów, funkcji oraz modułów. Platforma automatyzacji z kolei integruje się z systemem operacyjnym oraz aplikacjami zewnętrznymi poprzez interfejsy WMI, CIM i COM, dając nieograniczone możliwości zarządzania infrastrukturą.

3Dlaczego warto uczyć się PowerShell?

Zalety PowerShell

  • Automatyzacja - wykonaj w sekundach to, co ręcznie zajęłoby godziny
  • Wszechstronność - zarządzaj Windows, Linux, serwerami, chmurą (Azure)
  • Duże możliwości - dostęp do prawie wszystkich funkcji systemu
  • Popularność - wymagany w wielu firmach IT
  • Darmowy i open-source - możesz go używać bezpłatnie

Gdzie znajdziesz zastosowanie?

  • Administracja serwerami Windows
  • Zarządzanie użytkownikami i uprawnieniami
  • Tworzenie kopii zapasowych
  • Monitoring systemów i usług
  • Automatyczne instalacje i konfiguracje
Czy wiesz, że: PowerShell 7+ działa także na komputerach Mac i Linuksie. To oznacza, że jeden język pozwala zarządzać całą infrastrukturą IT.

Powody, dla których warto inwestować czas w naukę PowerShell, są bardzo praktyczne. Przede wszystkim narzędzie to pozwala na automatyzację rutynowych zadań administracyjnych, takich jak zarządzanie użytkownikami w Active Directory, monitorowanie usług systemowych czy wykonywanie kopii zapasowych. W środowiskach korporacyjnych umiejętność pisania skryptów PowerShell jest coraz częściej wymagana na stanowiskach administratorów oraz inżynierów IT. PowerShell doskonale sprawdza się także w środowiskach chmurowych, takich jak Microsoft Azure, gdzie umożliwia zarządzanie zasobami w chmurze za pomocą tych samych poleceń, których używasz lokalnie.

Dodatkowym atutem jest fakt, że PowerShell jest rozwijany jako projekt open source na GitHubie, co gwarantuje transparentność rozwoju oraz aktywną społeczność wsparcia. Modułowość narzędzia pozwala na rozszerzanie jego funkcjonalności o dedykowane biblioteki do zarządzania konkretnymi systemami. Wraz z rosnącą popularnością DevOps, PowerShell staje się nieodzownym elementem zestawu narzędzi każdego nowoczesnego specjalisty IT.

4PowerShell a inne powłoki

Porównanie powłok

Poznaj różnice między najpopularniejszymi powłokami systemowymi:

  • CMD (Command Prompt) - stara, ograniczona powłoka Windows. Operuje na tekście.
  • BASH - standardowa powłoka Linux/Unix. Operuje na tekście.
  • PowerShell - nowoczesna, obiektowa powłoka Microsoft. Operuje na obiektach .NET.
Przykład różnicy:
W CMD i BASH polecenie zwraca tekst, który musisz "parsować". W PowerShell zwracany jest obiekt z właściwościami - możesz się do nich od razu odwołać.

Porównanie PowerShell z innymi powłokami systemowymi uwidacznia przewagę nowoczesnego podejścia obiektowego nad tradycyjnym przetwarzaniem tekstowym. W CMD każde polecenie zwraca ciąg znaków, który administrator musi ręcznie przetwarzać, używając narzędzi takich jak find czy more. W BASH sytuacja wygląda podobnie – wyniki poleceń są tekstowe, a ich filtrowanie wymaga stosowania narzędzi takich jak grep, sed czy awk. PowerShell podchodzi do tego problemu w sposób rewolucyjny: każde polecenie zwraca w pełni ustrukturyzowany obiekt, którego właściwości można natychmiast wykorzystać bez żadnego dodatkowego przetwarzania.

Oprócz różnic w formacie danych, poszczególne powłoki różnią się także składnią i dostępnymi konstrukcjami językowymi. PowerShell oferuje spójną konwencję nazewniczą Czasownik-Rzeczownik, która ułatwia zapamiętywanie i wyszukiwanie poleceń. W CMD i BASH nazwy poleceń często są historyczne i nieintuicyjne, co wydłuża proces nauki. Dla administratorów zarządzających heterogenicznymi środowiskami znajomość PowerShell staje się kluczową umiejętnością pozwalającą na ujednolicenie procesów.

5Wersje PowerShell

Historia wersji

  • PowerShell 1.0 (listopad 2006) - pierwsza wersja, tylko Windows
  • PowerShell 2.0 (sierpień 2009) - zdalne zarządzanie, zadania w tle, transakcje
  • PowerShell 3.0 (wrzesień 2012) - uproszczona składnia, moduły, pomoc online
  • PowerShell 4.0 (październik 2013) - Desired State Configuration (DSC)
  • PowerShell 5.0 (luty 2016) - klasy, obsługa JSON, OneGet
  • PowerShell 5.1 (sierpień 2016) - wersja z Windows 10 Anniversary Update
  • PowerShell 7.0+ (marzec 2020+) - multiplatformowa, open-source

Jaką wersję masz?

Aby sprawdzić wersję PowerShell, uruchom polecenie:

# Sprawdzenie wersji PowerShell
# Zmienna $PSVersionTable zawiera informacje o wersji
$PSVersionTable

# Lub krócej - wyświetla tylko numer wersji
$PSVersionTable.PSVersion

Po uruchomieniu tego polecenia zobaczysz informacje o swojej wersji PowerShell, na przykład: Major=5, Minor=1, Build=xxxxx

Historia wersji PowerShell pokazuje dynamiczny rozwój tego narzędzia od pierwszej edycji wydanej w 2006 roku aż do dzisiejszego PowerShell 7. Każda kolejna wersja wprowadzała istotne usprawnienia: PowerShell 2.0 dodał zdalne zarządzanie oraz zadania w tle, wersja 3.0 uprościła składnię i wprowadziła moduły, a PowerShell 4.0 wzbogacił narzędzie o Desired State Configuration. Przełomowym momentem było wydanie PowerShell 7 w 2020 roku, który jako pierwszy działał w pełni na platformach Linux i macOS, stając się prawdziwie wieloplatformowym rozwiązaniem.

Wybór odpowiedniej wersji PowerShell ma znaczenie praktyczne. W systemach Windows znajdziesz domyślnie PowerShell 5.1, który jest ściśle zintegrowany z systemem i oferuje pełną kompatybilność z modułami systemowymi. Z kolei PowerShell 7 jest zalecany do nowych projektów ze względu na lepszą wydajność, nowe operatory i zgodność z .NET Core. Aby sprawdzić dostępną wersję na swoim komputerze, wystarczy wywołać zmienną $PSVersionTable, która zwraca szczegółowe informacje o środowisku wykonawczym.

6Instalacja PowerShell

Windows

PowerShell jest już zainstalowany w Windows 10 i Windows 11. Możesz go uruchomić na kilka sposobów:

  • Naciśnij Win + X i wybierz "Windows PowerShell" lub "Terminal Windows"
  • Naciśnij Win + R, wpisz powershell i naciśnij Enter
  • W pasku wyszukiwania wpisz "PowerShell"

Linux i macOS

Dla systemów Linux i macOS pobierz i zainstaluj PowerShell ze strony:

https://github.com/PowerShell/PowerShell

Zalecamy: Używaj Windows Terminal zamiast starego "Windows PowerShell" - ma lepszy interfejs i więcej funkcji.

Instalacja PowerShell w systemie Windows nie wymaga dodatkowych kroków, ponieważ narzędzie jest dostępne od razu po uruchomieniu systemu Windows 10 lub 11. Najwygodniejszym sposobem pracy jest skorzystanie z Windows Terminal, który oferuje zakładki, przezroczystość i obsługę wielu profili jednocześnie. W systemach Linux instalacja sprowadza się do pobrania pakietu odpowiedniego dla danej dystrybucji z oficjalnego repozytorium GitHub projektu PowerShell. W macOS instalację można przeprowadzić za pomocą menedżera pakietów Homebrew lub bezpośrednio z oficjalnego instalatora.

Po instalacji warto sprawdzić poprawność konfiguracji, uruchamiając polecenie `pwsh` w terminalu oraz weryfikując wersję za pomocą $PSVersionTable. PowerShell 7 instaluje się równolegle do wersji 5.1, co oznacza, że obie mogą współistnieć na tym samym systemie bez konfliktów. Dla administratorów pracujących zdalnie przydatna będzie także znajomość PowerShell Remoting, która umożliwia wykonywanie poleceń na odległych maszynach przy użyciu protokołu WS-Management.

7Interfejs PowerShell

Wygląd okna PowerShell

Po uruchomieniu PowerShell zobaczysz okno z promptem (znakiem zachęty):

PS C:\Users\Student>

Co oznaczają te elementy?

  • PS - oznacza, że jesteś w PowerShell (nie w CMD)
  • C:\Users\Student - aktualny folder (katalog), w którym pracujesz
  • > - znak zachęty, czeka na Twoje polecenie

Podstawowe polecenia nawigacji

  • Get-Location lub gl - pokazuje aktualny folder
  • Set-Location lub sl - zmienia folder
  • Clear-Host lub cls - czyści ekran

Interfejs użytkownika PowerShell na pierwszy rzut oka przypomina klasyczny wiersz poleceń, ale kryje w sobie znacznie więcej możliwości. Prompt w formacie `PS C:\Users\Student>` informuje nie tylko o bieżącej lokalizacji, ale także o kontekście wykonawczym. Dostępne są liczne sposoby personalizacji wyglądu okna, w tym zmiana kolorów, czcionki oraz przezroczystości, co zwiększa komfort pracy podczas długich sesji administracyjnych.

Windows Terminal stanowi współczesne środowisko pracy, które znacząco podnosi ergonomię w porównaniu z klasycznym konsolowym oknem. Aplikacja ta umożliwia otwieranie wielu zakładek, każdą z innym profilem, na przykład PowerShell, CMD, BASH w WSL czy Azure Cloud Shell. Dodatkowo Windows Terminal obsługuje przezroczystość tła, skróty klawiaturowe oraz zaawansowane profilowanie czcionek, co pozwala na dostosowanie wyglądu do indywidualnych preferencji użytkownika.

8Twoje pierwsze polecenia

Zacznijmy od prostych poleceń

Wpisz poniższe polecenia w PowerShell i obserwuj wyniki:

# Wyświetlenie tekstu
# Write-Host wyświetla tekst na ekranie
Write-Host "Witaj w PowerShell!"

# Wyświetlenie aktualnej daty
# Get-Date zwraca bieżącą datę i godzinę
Get-Date

# Wyświetlenie nazwy komputera
# Zmienna $env:COMPUTERNAME pobiera nazwę komputera z systemu
$env:COMPUTERNAME

# Lista uruchomionych procesów (pierwsze 5)
# Get-Process pobiera listę procesów, Select-Object wybiera 5 pierwszych
Get-Process | Select-Object -First 5

# Sprawdzenie wersji PowerShell
# Wyświetla wersję PowerShell, np. 5.1.22621.1
$PSVersionTable.PSVersion

Po wpisaniu każdego polecenia naciśnij Enter, aby je wykonać. Obserwuj, jakie wyniki zwraca PowerShell.

Ćwiczenie: Spróbuj wpisać każde polecenie osobno i zobacz, co się stanie. Nie martw się, jeśli coś wygląda dziwnie - to normalne na początku!

Pierwsze polecenia w PowerShell to najlepszy sposób na oswojenie się ze składnią i mechaniką działania tej powłoki. Write-Host pozwala na wyświetlanie dowolnego tekstu w oknie konsoli, natomiast Get-Date zwraca bieżącą datę i godzinę w formacie obiektowym. System Windows udostępnia także zmienne środowiskowe, takie jak $env:COMPUTERNAME, które przechowują informacje o konfiguracji sprzętowej i programowej komputera bez konieczności sięgania do panelu sterowania.

Get-Process to jedno z najczęściej używanych poleceń w codziennej administracji, które wyświetla listę wszystkich aktywnych procesów wraz z ich identyfikatorem, zużyciem pamięci i czasu procesora. Połączenie kilku poleceń za pomocą potoku, na przykład Get-Process | Select-Object -First 5, pozwala na tworzenie czytelnych i precyzyjnych zapytań. Eksperymentowanie z tymi podstawowymi poleceniami w interaktywnej konsoli to najskuteczniejszy sposób na naukę PowerShell.

9Cmdlet - serce PowerShell

Co to jest cmdlet?

Cmdlet (wymawiane "command-let") to podstawowe polecenie w PowerShell. Każdy cmdlet składa się z dwóch części:

Czasownik + Rzeczownik
Get-Process
Stop-Service
New-Item

Popularne czasowniki

  • Get - pobierz dane (np. Get-Process, Get-Service)
  • Set - ustaw wartość (np. Set-ExecutionPolicy)
  • New - utwórz nowy element (np. New-Item)
  • Remove - usuń element (np. Remove-Item)
  • Start/Stop - uruchom/zatrzymaj (np. Start-Service)
  • Copy/Move - kopiuj/przenieś (np. Copy-Item)

Cmdlety stanowią serce języka PowerShell i są fundamentem, na którym opiera się cała automatyzacja w tym środowisku. Każdy cmdlet podlega ścisłej konwencji nazewniczej Czasownik-Rzeczownik, która sprawia, że nazwy poleceń są intuicyjne i przewidywalne. Na przykład Get-Process, Stop-Service, New-Item czy Remove-Item – każda z tych nazw w jednoznaczny sposób określa, jaką akcję wykona polecenie i na jakim obiekcie będzie ona operować. Dzięki temu nawet bez zaglądania do dokumentacji można domyślić się przeznaczenia większości wbudowanych poleceń.

Popularne czasowniki takie jak Get, Set, New, Remove, Start, Stop, Copy czy Move pojawiają się w wielu różnych cmdletach, co dodatkowo ułatwia zapamiętywanie. Gdy znasz już kilka podstawowych czasowników, możesz z łatwością odgadnąć znaczenie nowo poznanego polecenia. W miarę postępów w nauce zaczniesz samodzielnie tworzyć własne cmdlety i funkcje, trzymając się tej samej konwencji, co zapewni czytelność i spójność Twojego kodu.

10Jak szukać pomocy: Get-Help

Polecenie Get-Help

Jeśli nie wiesz, jak użyć jakiegoś polecenia, użyj Get-Help. To jak podręcznik użytkownika wbudowany w PowerShell.

Przykłady użycia

# Podstawowa pomoc dla polecenia
# Wyświetla krótkie podsumowanie polecenia
Get-Help Get-Process

# Pokaż tylko przykłady użycia
# Bardzo przydatne, gdy chcesz szybko zobaczyć jak używać polecenia
Get-Help Get-Process -Examples

# Pokaż szczegółową pomoc ze wszystkimi parametrami
# Zawiera opis każdego parametru i jego zastosowanie
Get-Help Get-Process -Full

# Otwórz pomoc w osobnym oknie
# Wygodniejsze do czytania, bo nie znika przy przewijaniu
Get-Help Get-Process -ShowWindow

Parametr -Examples pokazuje praktyczne przykłady użycia polecenia. To najszybszy sposób na naukę nowych poleceń!

Wskazówka: Przed pierwszym użyciem pomocy warto zaktualizować dokumentację poleceniem Update-Help (wymaga uruchomienia jako Administrator).

Get-Help to wbudowany system pomocy w PowerShell, który powinien stać się Twoim pierwszym źródłem informacji podczas pracy z nowymi poleceniami. Najprostsze wywołanie `Get-Help Get-Process` wyświetla krótkie podsumowanie składni i opisu danego cmdleta. Dla bardziej zaawansowanych potrzeb parametr `-Examples` pokazuje praktyczne przykłady użycia, które często są najszybszym sposobem na zrozumienie działania polecenia. Z kolei `-Full` wyświetla pełną dokumentację wraz z opisem wszystkich parametrów oraz typami danych wejściowych i wyjściowych.

Przed pierwszym użyciem Get-Help warto zaktualizować lokalną dokumentację poleceniem `Update-Help`, które pobiera najnowsze opisy i przykłady z serwerów Microsoft. Alternatywnie parametr `-Online` otwiera przeglądarkę z aktualną dokumentacją z witryny Microsoft Docs. Systematyczne korzystanie z wbudowanego systemu pomocy jest jedną z najważniejszych umiejętności samodzielnego rozwiązywania problemów w PowerShell.

11Jak szukać poleceń: Get-Command

Polecenie Get-Command

Nie wiesz, jakie polecenie wykona daną operację? Użyj Get-Command do wyszukiwania.

# Znajdź wszystkie polecenia związane z "process"
# Gwiazdka * oznacza "dowolny tekst"
# Wynik: Get-Process, Stop-Process, Wait-Process itp.
Get-Command *Process*

# Znajdź polecenia z czasownikiem "Get" i rzeczownikiem "Service"
# Czyli wyszukuje polecenia typu Get-Service
Get-Command -Verb Get -Noun *Service*

# Znajdź polecenia związane z plikami
# Wynik: Get-FileHash, Test-Path, Join-Path itp.
Get-Command *File*

# Policz, ile masz dostępnych poleceń
# Nawiasy () oznaczają, że najpierw wykonaj polecenie w środku,
# a potem pobierz właściwość Count
(Get-Command).Count

Symbol gwiazdki (*) to tzw. wildcard (symbol wieloznaczny). Oznacza "dowolny tekst". Dzięki temu możesz wyszukiwać polecenia nawet gdy nie pamiętasz ich dokładnej nazwy.

Ciekawostka: PowerShell ma ponad 1500 wbudowanych poleceń! Używaj filtrów, aby szybko znaleźć to, czego potrzebujesz.

Get-Command to potężne narzędzie do wyszukiwania poleceń, które powinieneś znać, gdy nie pamiętasz dokładnej nazwy cmdleta. Najprostsze użycie `Get-Command *Process*` znajduje wszystkie polecenia zawierające w nazwie słowo Process, niezależnie od tego, czy jest to czasownik, czy rzeczownik. Dzięki symbolom wieloznacznym możesz elastycznie przeszukiwać dostępne zasoby nawet wtedy, gdy znasz tylko fragment szukanej nazwy. W przypadku, gdy znasz czasownik, ale nie pamiętasz rzeczownika, możesz użyć `Get-Command -Verb Get -Noun *Service*`.

Jedną z ciekawych funkcji Get-Command jest możliwość policzenia wszystkich dostępnych poleceń w systemie za pomocą `(Get-Command).Count`. W standardowej instalacji PowerShell liczba ta przekracza często 1500 pozycji, co pokazuje ogrom możliwości tego narzędzia. Systematyczne korzystanie z Get-Command w połączeniu z Get-Help stanowi podstawę samodzielnej nauki i eksploracji nowych obszarów PowerShell bez konieczności zapamiętywania wszystkich poleceń na pamięć.

12Potok obiektowy - podstawy

Co to jest potok?

Potok (pipeline) to sposób łączenia poleceń. Wynik jednego polecenia przekazujesz do następnego za pomocą znaku |.

Polecenie1 | Polecenie2 | Polecenie3

Przykłady

# Bez potoku - tylko wyświetlamy procesy
# Get-Process zwraca listę wszystkich procesów
Get-Process

# Z potokiem - bierzemy procesy i wybieramy tylko 5 pierwszych
# Najpierw Get-Process pobiera wszystkie procesy,
# potem Select-Object zostawia tylko 5 pierwszych
Get-Process | Select-Object -First 5

# Z potokiem - wyświetlamy tylko nazwy procesów
# Select-Object wybiera tylko właściwość Name z każdego procesu
Get-Process | Select-Object -Property Name

Potok działa jak rura - dane przepływają z jednego polecenia do drugiego. Każde polecenie w potoku przetwarza dane z poprzedniego i przekazuje wynik do następnego.

Potok obiektowy to jedna z najważniejszych koncepcji w PowerShell, która odróżnia tę powłokę od tradycyjnych odpowiedników. W CMD i BASH potok przekazuje tekst między poleceniami, co wymaga żmudnego parsowania i formatowania danych. PowerShell zamiast tego przekazuje w potoku całe obiekty, zachowując ich strukturę i typy. Oznacza to, że wynik polecenia `Get-Process` to nie tekst, a kolekcja obiektów typu `System.Diagnostics.Process`, które mają swoje właściwości i metody dostępne natychmiast po przejściu przez potok.

Operator potoku `|` pozwala na łączenie dowolnej liczby poleceń w czytelny łańcuch przetwarzania danych. Każde kolejne polecenie w potoku otrzymuje obiekty z poprzedniego etapu i może je filtrować, przekształcać lub sortować. Dzięki temu jeden wiersz kodu może zastąpić kilkanaście linii tradycyjnego skryptu. Zrozumienie potoku obiektowego jest kluczowe dla efektywnego wykorzystania PowerShell w codziennej pracy.

13Poznaj obiekty: Get-Member

Co to jest Get-Member?

Pokazuje, jakie właściwości (dane) i metody (akcje) ma dany obiekt.

Gdy nie wiesz, jakie informacje możesz wyciągnąć z jakiegoś obiektu, użyj Get-Member.

# Zobacz wszystkie właściwości i metody obiektu "tekst"
# "tekst" to obiekt typu string, zobaczysz co potrafi
"jakiś tekst" | Get-Member

# Zobacz właściwości procesu
# Zobaczysz Name, Id, CPU, WorkingSet itp.
Get-Process | Get-Member

# Zobacz właściwości daty
# Zobaczysz Year, Month, Day, DayOfWeek itp.
Get-Date | Get-Member

# Zobacz tylko właściwości (Property)
# Pomija metody, pokazuje tylko dane
Get-Process | Get-Member -MemberType Property

Property (właściwość) to jakby "cecha" obiektu - np. imię osoby. Method (metoda) to "czynność" którą obiekt może wykonać - np. osoba może się przedstawić.

Wskazówka: Szukaj słów Property (właściwości) - to są dane, które możesz odczytać. Method (metody) to czynności, które możesz wykonać.

Get-Member to niezbędne narzędzie do eksploracji obiektów w PowerShell, które pozwala podejrzeć strukturę każdego wyniku zwróconego przez dowolne polecenie. Używając `Get-Process | Get-Member`, zobaczysz listę wszystkich właściwości i metod dostępnych dla obiektów procesu. Właściwości (Property) są danymi przechowywanymi w obiekcie, takimi jak Name, Id, CPU, WorkingSet, natomiast metody (Method) to akcje, które obiekt może wykonać, na przykład Kill czy Refresh.

Zrozumienie różnicy między właściwościami a metodami ma bezpośrednie przełożenie na pisanie skryptów. Gdy chcesz odczytać dane, korzystasz z właściwości (np. `$process.Name`), a gdy chcesz wykonać akcję, wywołujesz metodę (np. `$process.Kill()`). Get-Member potrafi także odfiltrować tylko właściwości za pomocą parametru `-MemberType Property`, co jest przydatne, gdy interesują Cię wyłącznie dane, a nie dostępne akcje.

14Zmienne - wprowadzenie

Co to jest zmienna?

Zmienna to pojemnik na dane. Pozwala zapisać wartość pod określoną nazwą, aby później jej użyć.

Jak nazwać zmienną?

  • Nazwa zawsze zaczyna się od znaku $
  • Może zawierać litery, cyfry i podkreślenia
  • Nie może zawierać spacji
  • Wielkość liter ma znaczenie ($imie to nie to samo co $Imie)
# Tworzenie zmiennej i przypisanie wartości
# Znak = przypisuje wartość do zmiennej
$imie = "Anna"        # zmienna tekstowa
$wiek = 21           # zmienna liczbowa
$pi = 3.14           # zmienna dziesiętna

# Wyświetlenie wartości zmiennej
# PowerShell automatycznie podstawia wartość zmiennej
Write-Host "Cześć, $imie!"       # Wyświetli: Cześć, Anna!
Write-Host "Masz $wiek lat."       # Wyświetli: Masz 21 lat.

# Zmiana wartości zmiennej
# Możesz zmienić wartość w dowolnym momencie
$wiek = 22
Write-Host "Teraz masz $wiek lat."  # Wyświetli: Teraz masz 22 lat.

Zmienne pozwalają zapamiętać dane do późniejszego użycia. Zapisz imię użytkownika raz, a potem używaj wielokrotnie w skrypcie.

Zmienne w PowerShell są podstawowym elementem każdego skryptu, umożliwiającym przechowywanie i wielokrotne używanie danych w trakcie wykonywania kodu. Nazwa zmiennej zawsze zaczyna się od znaku dolara `$`, co odróżnia zmienne od zwykłych poleceń i ułatwia ich identyfikację w kodzie. PowerShell dopuszcza używanie w nazwach zmiennych liter, cyfr i podkreśleń, przy czym wielkość liter ma znaczenie: `$imie` i `$Imie` to dwie różne zmienne, co jest częstą pułapką dla początkujących.

W przeciwieństwie do języków statycznie typowanych, PowerShell domyślnie automatycznie rozpoznaje typ zmiennej na podstawie przypisanej wartości. Zmienna `$tekst = "Hello"` automatycznie stanie się typem string, a `$liczba = 42` typem int. Takie zachowanie ułatwia szybkie pisanie skryptów, ale może prowadzić do subtelnych błędów, gdy nie kontrolujemy jawnie oczekiwanego typu danych. W miarę postępów w nauce warto rozważyć jawne deklarowanie typów dla kluczowych zmiennych w większych projektach.

15Typy danych - podstawy

Podstawowe typy danych

  • [string] - tekst, np. "Hello World"
  • [int] - liczba całkowita, np. 42
  • [double] - liczba dziesiętna, np. 3.14
  • [bool] - wartość logiczna: $true lub $false
  • [datetime] - data i czas
  • [array] - kolekcja elementów

Jak sprawdzić typ zmiennej?

# PowerShell automatycznie rozpoznaje typ
# Nie musisz go podawać - PowerShell "domyśli się"
$tekst = "Hello"    # Automatycznie string
$liczba = 42         # Automatycznie int
$prawda = $true     # Automatycznie bool

# Sprawdzenie typu zmiennej
# Metoda GetType() zwraca obiekt z informacją o typie
$tekst.GetType()    # Pokaże: IsPublic=True, IsSerial=True, Name=String
$liczba.GetType()    # Pokaże: Name=Int32

# Możesz też sprawdzić krócej - pobierz tylko pełną nazwę typu
$tekst.GetType().FullName  # Pokaże: System.String

PowerShell jest "typowany dynamicznie" - sam rozpoznaje typ zmiennej na podstawie wartości. Nie musisz go podawać, ale możesz, jeśli chcesz mieć pewność.

PowerShell obsługuje wszystkie podstawowe typy danych znane z platformy .NET, ale udostępnia je w uproszczonej formie dostosowanej do potrzeb skryptowych. Typ string służy do przechowywania tekstu i oferuje bogaty zestaw metod operacji na łańcuchach, takich jak dzielenie, łączenie czy wyszukiwanie wzorców. Typy liczbowe int i double odpowiadają za liczby całkowite i zmiennoprzecinkowe, a bool przechowuje wartości logiczne $true i $false używane w warunkach. Typ datetime obsługuje daty i godziny, co jest szczególnie przydatne przy przetwarzaniu logów.

Sprawdzanie typu zmiennej w trakcie wykonywania skryptu jest możliwe za pomocą metody `GetType()`, która zwraca obiekt z informacjami o typie. Na przykład `$zmienna.GetType().FullName` wyświetli pełną kwalifikowaną nazwę typu, taką jak `System.String`. Znajomość typów danych i umiejętność ich konwersji między sobą są niezbędne przy pisaniu zaawansowanych skryptów, szczególnie gdy dane pochodzą z różnych źródeł, takich jak pliki CSV czy API REST.

16Jawne określanie typu zmiennej

Dlaczego warto określać typ?

Jawne określenie typu pomaga uniknąć błędów i sprawia, że kod jest bardziej czytelny.

Składnia

[Typ]$nazwaZmiennej = wartość

# Jawna deklaracja różnych typów
# Nawias kwadratowy przed nazwą oznacza typ
[string]$imie = "Jan"           # Tylko tekst
[int]$wiek = 25                # Tylko liczba całkowita
[bool]$jestStudentem = $true  # Tylko prawda/fałsz
[double]$pensja = 4500.50      # Liczba z przecinkiem
[datetime]$dzis = Get-Date     # Data i godzina

# Wyświetlenie
Write-Host "Imię: $imie"
Write-Host "Wiek: $wiek"
Write-Host "Czy student: $jestStudentem"
# Po uruchomieniu zobaczysz:
# Imię: Jan
# Wiek: 25
# Czy student: True

Gdy zadeklarujesz typ jako [int], PowerShell nie pozwoli przypisać do tej zmiennej tekstu. To zabezpiecza przed pomyłkami w kodzie.

Uwaga: Jeśli spróbujesz przypisać wartość niezgodną z zadeklarowanym typem, PowerShell zgłosi błąd.

Jawne określanie typu zmiennej w PowerShell to dobra praktyka, która pomaga wcześnie wykrywać błędy i czyni kod bardziej czytelnym dla innych programistów. Deklaracja `[string]$imie = "Jan"` informuje PowerShell, że zmienna $imie może przechowywać wyłącznie tekst, a próba przypisania liczby zakończy się błędem konwersji. Dzięki temu unikasz sytuacji, w których zmienna zmienia typ w trakcie działania skryptu, prowadząc do niespodziewanych zachowań.

Jawna deklaracja jest szczególnie przydatna w przypadku parametrów funkcji oraz w większych projektach, gdzie różne osoby pracują nad tym samym kodem. Określenie typu parametru w bloku param() pełni także funkcję dokumentacyjną, ponieważ od razu widać, jakiego rodzaju dane powinna przyjmować funkcja. W codziennej pracy interaktywnej możesz jednak swobodnie polegać na automatycznym wnioskowaniu typów, ponieważ PowerShell radzi sobie z tym bardzo dobrze w większości standardowych sytuacji.

17Specjalne wartości zmiennych

Wartości specjalne

  • $null - oznacza "brak wartości" (pustka)
  • $true - prawda (wartość logiczna)
  • $false - fałsz (wartość logiczna)
  • $_ - bieżący element w potoku
# $null - brak wartości
# Użyj, gdy zmienna nie ma jeszcze żadnej wartości
$brakWartosci = $null

# Sprawdzenie, czy zmienna jest pusta
if ($brakWartosci -eq $null) {
    Write-Host "Zmienna jest pusta"
}

# $true i $false - wartości logiczne
# Używane w warunkach (if, while)
$czyJestWeekend = $false
$czyPadaDeszcz = $true

# $_ - bieżący element w potoku
# Bardzo ważne! Oznacza "aktualnie przetwarzany element"
# Ten przykład znajdzie procesy, które używają więcej niż 10 CPU
Get-Process | Where-Object { $_.CPU -gt 10 }
# $_ reprezentuje każdy proces z osobna w pętli Where-Object

Zmienna $_ to jak "to" w zdaniu "dla każdego elementu zrób to". Gdy przetwarzasz listę procesów, $_ oznacza "bieżący proces".

Zapamiętaj: Zmienna $_ jest bardzo ważna w potoku - reprezentuje "aktualny obiekt".

Specjalne wartości zmiennych w PowerShell pełnią kluczowe role w strukturze języka i pojawiają się w niemal każdym skrypcie. $null oznacza całkowity brak wartości i jest używany do inicjalizacji zmiennych, które jeszcze nie mają danych, oraz do sprawdzania, czy obiekt istnieje. Wartości logiczne $true i $false są fundamentem instrukcji warunkowych i pętli, a ich poprawne stosowanie decyduje o logice działania całego skryptu.

Zmienna `$_` (znana również jako `$PSItem`) to automatyczny wskaźnik bieżącego obiektu w potoku, który pojawia się w blokach Where-Object, ForEach-Object oraz innych konstrukcjach przetwarzających kolekcje. Gdy piszesz `Get-Process | Where-Object { $_.CPU -gt 10 }`, zmienna $_ reprezentuje każdy kolejny proces przekazywany przez potok. Zrozumienie i poprawne używanie $_ jest kluczowe dla efektywnego filtrowania i przekształcania danych w PowerShell.

18Zmienne środowiskowe

Co to są zmienne środowiskowe?

To zmienne systemu operacyjnego, przechowujące informacje o środowisku pracy.

Dostęp do zmiennych środowiskowych

Używamy notacji $env:nazwa

# Nazwa komputera - pobiera nazwę z ustawień Windows
$env:COMPUTERNAME

# Nazwa zalogowanego użytkownika
$env:USERNAME

# Ścieżka do folderu użytkownika (np. C:\Users\Jan)
$env:USERPROFILE

# Ścieżka tymczasowa (gdzie system trzyma pliki tymczasowe)
$env:TEMP

# Zmienna PATH - ścieżki wyszukiwania programów
# Gdy wpisujesz "notepad", system szuka go w tych folderach
$env:Path

# Podziel zmienną PATH na części (każda ścieżka osobno)
# -split ';' dzieli tekst na tablicę przy znaku średnika
$env:Path -split ';' | ForEach-Object { $_ }

Dzięki zmiennym środowiskowym Twój skrypt może automatycznie pobrać informacje o komputerze i użytkowniku, bez pytania o nie.

Zmienne środowiskowe w PowerShell zapewniają dostęp do informacji o konfiguracji systemu operacyjnego i środowiska użytkownika bez konieczności odczytywania ich z rejestru lub plików konfiguracyjnych. Dostęp do zmiennych środowiskowych odbywa się za pomocą notacji `$env:NAZWA`, gdzie `env` jest nazwą providera środowiskowego, a NAZWA to konkretna zmienna. Na przykład `$env:COMPUTERNAME` zwraca nazwę komputera, a `$env:USERNAME` login bieżącego użytkownika.

Szczególnie przydatna w praktyce jest zmienna `$env:TEMP`, która wskazuje na folder plików tymczasowych, oraz `$env:Path`, która zawiera listę katalogów przeszukiwanych przez system przy uruchamianiu programów. Zmienne środowiskowe można także modyfikować w bieżącej sesji, co przydaje się przy konfigurowaniu ścieżek dostępu dla różnych wersji narzędzi programistycznych. Umiejętność pracy ze zmiennymi środowiskowymi jest niezbędna w codziennej administracji systemami.

19Tablice - wprowadzenie

Co to jest tablica?

Tablica to kolekcja elementów zapisanych pod jedną nazwą. Każdy element ma swój numer (indeks).

Jak działa indeksowanie?

Elementy w tablicy są ponumerowane od 0. Pierwszy element ma indeks 0, drugi - 1, itd.

# Tworzenie tablicy za pomocą @
# Elementy oddzielamy przecinkami
$kolory = @("czerwony", "zielony", "niebieski")
$liczby = @(1, 2, 3, 4, 5)

# Dostęp do elementów (indeksowanie od 0!)
# Uwaga! Pierwszy element ma indeks [0], nie [1]!
Write-Host "Pierwszy kolor: $($kolory[0])"   # czerwony
Write-Host "Drugi kolor: $($kolory[1])"      # zielony
Write-Host "Trzeci kolor: $($kolory[2])"     # niebieski

# Pobranie ostatniego elementu
# Indeks [-1] zawsze oznacza ostatni element
$ostatni = $kolory[-1]
Write-Host "Ostatni kolor: $ostatni"

# Liczba elementów w tablicy
# Właściwość Count zwraca liczbę elementów
Write-Host "Liczba kolorów: $($kolory.Count)"

Pamiętaj: indeksowanie zaczyna się od 0! Pierwszy element to [0], drugi to [1], itd. To częsta przyczyna błędów u początkujących.

Tablice w PowerShell są podstawową strukturą danych używaną do przechowywania kolekcji elementów tego samego lub różnych typów. Indeksowanie tablicy rozpoczyna się od zera, co oznacza, że pierwszy element ma indeks [0], drugi [1], a ostatni [-1]. Ta konwencja, choć nieintuicyjna dla początkujących, jest standardem w większości języków programowania i pozwala na szybki dostęp do dowolnego elementu kolekcji.

Tablicę tworzy się za pomocą operatora `@()` z elementami oddzielonymi przecinkami, na przykład `$kolory = @("czerwony", "zielony", "niebieski")`. Liczbę elementów w tablicy odczytujemy przez właściwość `Count`, a dostęp do pojedynczego elementu przez nawiasy kwadratowe z indeksem. Tablice w PowerShell są elastyczne i mogą zawierać elementy różnych typów, co jest przydatne przy grupowaniu powiązanych ze sobą danych.

20Operacje na tablicach

Dodawanie i usuwanie elementów

Tablice w PowerShell można modyfikować - dodawać i usuwać elementy.

# Tworzenie tablicy
$owoce = @("jabłko", "banan", "pomarańcza")

# Dodawanie elementu
# Operator += dodaje nowy element na końcu tablicy
$owoce += "winogrono"
Write-Host "Po dodaniu: $($owoce -join ', ')"
# Wynik: jabłko, banan, pomarańcza, winogrono

# Usuwanie elementu
# Tworzymy nową tablicę bez "banan"
$owoce = $owoce | Where-Object { $_ -ne "banan" }
Write-Host "Po usunięciu banana: $($owoce -join ', ')"
# Wynik: jabłko, pomarańcza, winogrono

# Sprawdzenie, czy element istnieje
# Operator -in sprawdza, czy element jest w tablicy
if ("jabłko" -in $owoce) {
    Write-Host "Jabłko jest w tablicy!"
}

# Iteracja po tablicy - przejdź przez każdy element
foreach ($owoc in $owoce) {
    Write-Host "Lubię: $owoc"
}

Operator -join łączy elementy tablicy w tekst, wstawiając między nie podany znak (np. przecinek).

Operacje na tablicach w PowerShell umożliwiają dynamiczne zarządzanie kolekcjami danych bezpośrednio z poziomu skryptu. Dodawanie nowego elementu realizuje się za pomocą operatora `+=`, który w rzeczywistości tworzy nową tablicę z dodatkowym elementem na końcu. Mimo że operacja wygląda jak modyfikacja istniejącej tablicy, w praktyce PowerShell za każdym razem tworzy nową kolekcję, co ma znaczenie dla wydajności przy bardzo dużych zbiorach danych.

Usuwanie elementów z tablicy wymaga nieco innego podejścia, ponieważ tablice w PowerShell są strukturami o stałym rozmiarze. Najczęściej stosowaną metodą jest filtrowanie za pomocą Where-Object, które tworzy nową tablicę bez elementów spełniających warunek usunięcia. Operator `-in` pozwala szybko sprawdzić, czy dany element istnieje w tablicy, a pętla foreach umożliwia iterację po wszystkich elementach. Te techniki są fundamentem przetwarzania danych w PowerShell.

21Tablice mieszające (Hash Tables)

Co to jest tablica mieszająca?

To kolekcja par klucz-wartość. Zamiast odwoływać się po numerze (indeksie), odwołujesz się po nazwie (kluczu).

Przykład z życia

Tablica mieszająca to jak książka telefoniczna - szukasz osoby po nazwisku (klucz).

# Tworzenie tablicy mieszającej za pomocą @
# Struktura: Klucz = Wartość
$osoba = @{
    Imie = "Anna"
    Nazwisko = "Kowalska"
    Wiek = 25
    Miasto = "Warszawa"
}

# Dostęp do wartości przez klucz - sposób 1 (kropka)
Write-Host "Imię: $($osoba.Imie)"              # Anna
Write-Host "Nazwisko: $($osoba.Nazwisko)"     # Kowalska

# Dostęp do wartości przez klucz - sposób 2 (nawiasy)
Write-Host "Wiek: $($osoba['Wiek'])"           # 25

# Dodawanie nowej pary klucz-wartość
$osoba.Telefon = "123-456-789"                # sposób kropka
$osoba["Email"] = "anna@example.com"           # sposób nawiasy

# Wyświetlenie wszystkich kluczy
$osoba.Keys
# Wynik: Imie, Nazwisko, Wiek, Miasto, Telefon, Email

Tablica mieszająca jest jakby "mini bazą danych" w jednej zmiennej. Zamiast pamiętać, że "Anna" jest pod indeksem 0, odwołujesz się do $osoba.Imie.

Tablice mieszające (Hash Tables) to jeden z najpotężniejszych typów danych w PowerShell, który pozwala na przechowywanie par klucz-wartość w jednej strukturze. W odróżnieniu od zwykłych tablic, gdzie dostęp do danych odbywa się przez indeks numeryczny, w tablicy mieszającej używamy nazwanych kluczy, co znacznie poprawia czytelność i ułatwia nawigację w kodzie. Tworzenie tablicy mieszającej odbywa się za pomocą `@{}` z parami Klucz = Wartość oddzielonymi średnikami lub nowymi liniami.

Dostęp do wartości w tablicy mieszającej jest możliwy na dwa sposoby: przez notację kropkową `$osoba.Imie` lub przez nawiasy kwadratowe z kluczem `$osoba["Imie"]`. Obie metody są równoważne i wybór między nimi zależy od preferencji oraz kontekstu. Tablice mieszające są często używane do przechowywania danych konfiguracyjnych, mapowania wartości oraz jako lekka alternatywa dla obiektów PSCustomObject.

22Operacje na tablicach mieszających

Modyfikowanie i iteracja

Tablice mieszające oferują wiele przydatnych operacji.

# Tworzenie tablicy mieszającej
$uzytkownik = @{
    Login = "student01"
    Haslo = "tajne123"
    Uprawnienia = "admin"
}

# Modyfikacja wartości - po prostu przypisz nową wartość
$uzytkownik.Haslo = "noweHaslo456"

# Usuwanie klucza wraz z wartością
$uzytkownik.Remove("Haslo")

# Iteracja po parach klucz-wartość
# Przejdź przez każdy klucz i pobierz jego wartość
foreach ($klucz in $uzytkownik.Keys) {
    $wartosc = $uzytkownik[$klucz]
    Write-Host "$klucz = $wartosc"
}
# Wynik:
# Login = student01
# Uprawnienia = admin

# Sprawdzenie, czy klucz istnieje
if ($uzytkownik.ContainsKey("Login")) {
    Write-Host "Klucz Login istnieje"
}

Metoda .Keys zwraca listę wszystkich kluczy w tablicy mieszającej. Możesz użyć tej listy do iteracji przez wszystkie dane.

Operacje na tablicach mieszających w PowerShell są intuicyjne i przypominają pracę z obiektami w językach obiektowych. Modyfikacja wartości istniejącego klucza polega po prostu na przypisaniu nowej wartości do tego samego klucza, tak jak w przypadku zmiennych. Usuwanie pary klucz-wartość wykonuje się metodą `Remove(klucz)`, która przyjmuje nazwę klucza jako argument i usuwa go wraz z przypisaną wartością.

Iteracja po tablicy mieszającej najczęściej odbywa się przez właściwość `Keys`, która zwraca kolekcję wszystkich kluczy. Dla każdego klucza możemy pobrać odpowiadającą mu wartość i wykonać na niej dowolne operacje. Metoda `ContainsKey(klucz)` pozwala sprawdzić, czy dany klucz istnieje w tablicy, co jest przydatne przed próbą odczytu wartości, aby uniknąć błędu nieistniejącego klucza. Dzięki tym mechanizmom tablice mieszające są niezwykle elastyczne i przydatne w codziennej pracy.

23Komentarze - jak pisać wyjaśnienia

Co to są komentarze?

Komentarze to tekst w kodzie, który jest ignorowany przez komputer. Służą do wyjaśniania kodu dla ludzi.

Rodzaje komentarzy

  • Jednoliniowe - zaczynają się od #
  • Wieloliniowe - zaczynają się od <# i kończą #>
# To jest komentarz jednoliniowy
# Komputer go ignoruje, pomaga ludziom rozumieć kod

# Poniżej tworzę zmienną z imieniem
$imie = "Jan"

<#
    To jest komentarz
    wieloliniowy.
    Może zawierać wiele
    linii tekstu.
#>

# Przykład użycia komentarzy w kodzie
$wiek = 20  # To jest komentarz "końcowy" - w linii

Komentarz końcowy (po #) wyjaśnia, co robi dana linia. Komentarze blokowe (<# #>) służą do dłuższych wyjaśnień na początku pliku lub funkcji.

Dobra praktyka: Pisz komentarze, które wyjaśniają dlaczego coś robisz, a nie co robisz. Sam kod mówi "co", komentarz powinien wyjaśniać kontekst.

Komentarze w PowerShell są ważnym elementem dobrych praktyk programistycznych, choć bywają pomijane przez początkujących. Komentarz jednoliniowy rozpoczyna się od znaku `#` i obowiązuje do końca linii, co pozwala na szybkie opisywanie pojedynczych instrukcji. Komentarz blokowy otwierany znacznikiem `<#` i zamykany `#>` pozwala na umieszczanie dłuższych opisów obejmujących wiele linii, na przykład na początku pliku ze skryptem.

Zasada pisania dobrych komentarzy mówi, że powinny one wyjaśniać przede wszystkim kontekst i uzasadnienie działania, a nie to, co robi kod. Sam kod w PowerShell w większości przypadków jest wystarczająco czytelny, aby zrozumieć co robi, ale komentarz wyjaśnia dlaczego został napisany w dany sposób. W profesjonalnych projektach warto stosować komentarze blokowe na początku każdej funkcji, opisujące jej parametry, wartości zwracane i potencjalne efekty uboczne.

24Wprowadzanie danych: Read-Host

Polecenie Read-Host

Pozwala na pobranie danych od użytkownika podczas działania skryptu.

Jak działa?

Skrypt zatrzymuje się i czeka, aż użytkownik wpisze coś i naciśnie Enter.

# Proste wprowadzenie danych
# Najpierw wyświetl pytanie
Write-Host "Jak masz na imię?"
# Następnie pobierz odpowiedź od użytkownika
$imie = Read-Host
Write-Host "Cześć, $imie!"

# Wprowadzenie z podpowiedzią
# Read-Host może wyświetlić podpowiedź w jednej linii
$nazwisko = Read-Host "Podaj swoje nazwisko"
Write-Host "Twoje nazwisko to: $nazwisko"

# Wprowadzenie liczby
# Read-Host ZAWSZE zwraca tekst, więc trzeba konwertować
# Nawias [int] konwertuje tekst na liczbę
$wiek = [int](Read-Host "Ile masz lat?")
Write-Host "Za rok będziesz mieć $($wiek + 1) lat"

Read-Host zawsze zwraca tekst (string). Gdy potrzebujesz liczby, musisz użyć konwersji [int] lub [double].

Read-Host to podstawowe polecenie służące do interaktywnego pobierania danych od użytkownika w trakcie działania skryptu. Po wywołaniu Read-Host skrypt wstrzymuje swoje działanie i czeka, aż użytkownik wpisze tekst i zatwierdzi go klawiszem Enter. Ważną cechą Read-Host jest to, że zawsze zwraca wartość typu string, niezależnie od tego, czy użytkownik wpisał liczbę, datę czy inny typ danych.

Konwersja pobranego tekstu na odpowiedni typ jest obowiązkiem autora skryptu i realizuje się ją przez jawne rzutowanie za pomocą nawiasów kwadratowych, na przykład `[int](Read-Host "Podaj wiek")`. W przypadku podania przez użytkownika wartości niezgodnej z oczekiwanym typem, PowerShell zgłosi błąd konwersji, który należy obsłużyć w bloku try-catch. Read-Host jest szczególnie przydatny w skryptach interaktywnych oraz edukacyjnych, gdzie użytkownik ma bezpośredni wpływ na przebieg wykonywanych operacji.

25Wyświetlanie danych: Write-Host

Polecenie Write-Host

Służy do wyświetlania tekstu i wartości zmiennych na ekranie.

Kolorowanie tekstu

Możesz nadać tekstowi kolor za pomocą parametru -ForegroundColor.

# Podstawowe użycie
Write-Host "Witaj w PowerShell!"

# Wyświetlanie zmiennej
# PowerShell automatycznie podstawi wartość zmiennej
$imie = "Anna"
Write-Host "Cześć, $imie!"   # Wynik: Cześć, Anna!

# Kolorowanie tekstu - zmiana koloru liter
Write-Host "To jest ważny komunikat!" -ForegroundColor Red
Write-Host "To jest sukces!" -ForegroundColor Green
Write-Host "To jest ostrzeżenie!" -ForegroundColor Yellow
Write-Host "To jest informacja." -ForegroundColor Cyan

# Kolorowanie tła tekstu
Write-Host "Tekst na żółtym tle" -BackgroundColor Yellow

Kolorowanie jest przydatne do wyróżniania ważnych informacji w skryptach - np. błędy na czerwono, sukcesy na zielono.

Dostępne kolory: Black, Blue, Green, Cyan, Red, Magenta, Yellow, White

Write-Host to podstawowe polecenie wyjścia w PowerShell, służące do wyświetlania tekstu w oknie konsoli. Mimo że istnieją również inne polecenia wyjścia, takie jak Write-Output czy Write-Verbose, Write-Host jest najprostszy i najczęściej używany w codziennej pracy. Jego główną zaletą jest możliwość kolorowania tekstu za pomocą parametrów `-ForegroundColor` i `-BackgroundColor`, co pozwala na wizualne rozróżnienie komunikatów różnego typu.

Kolorowanie komunikatów jest szczególnie przydatne w skryptach generujących raporty lub w narzędziach diagnostycznych, gdzie użytkownik musi szybko odróżnić błędy od informacji. Na przykład błędy można wyświetlać na czerwono, ostrzeżenia na żółto, a sukcesy na zielono, co znacznie poprawia czytelność wyników. Dostępne kolory to między innymi Black, Blue, Green, Cyan, Red, Magenta, Yellow oraz White, które można dowolnie łączyć w celu uzyskania czytelnych komunikatów.

26Argumenty wiersza poleceń: param()

Co to są argumenty?

Argumenty to wartości przekazywane do skryptu przy jego uruchomieniu. Pozwalają na tworzenie elastycznych skryptów.

Jak zdefiniować parametry?

Używamy bloku param() na początku skryptu lub funkcji.

# Plik: Witaj.ps1
# Parametry definiujemy w bloku param() na początku
param(
    [string]$Imie,     # Parametr tekstowy (bez wartości domyślnej)
    [int]$Wiek = 18     # Parametr liczbowy z wartością domyślną 18
)

Write-Host "Cześć, $Imie!"
Write-Host "Masz $Wiek lat."

# URUCHOMIENIE SKRYPTU:
# Podajemy argumenty po nazwie parametru (najbezpieczniejsze)
# .\Witaj.ps1 -Imie Anna -Wiek 25
# Wynik: Cześć, Anna! Masz 25 lat.

# Można też bez podawania nazwy (kolejność ma znaczenie)
# .\Witaj.ps1 Anna 25
# Wynik: Cześć, Anna! Masz 25 lat.

# Gdy nie podamy -Wiek, użyje wartości domyślnej 18
# .\Witaj.ps1 -Imie Jan
# Wynik: Cześć, Jan! Masz 18 lat.

Parametr z wartością domyślną (jak $Wiek = 18) jest opcjonalny. Gdy użytkownik go nie poda, zostanie użyta wartość domyślna.

Parametry skryptu zdefiniowane w bloku `param()` pozwalają na tworzenie elastycznych narzędzi, które mogą być uruchamiane z różnymi argumentami w zależności od potrzeb. Parametry mogą być obowiązkowe lub opcjonalne, a dla parametrów opcjonalnych można zdefiniować wartości domyślne, które zostaną użyte, gdy użytkownik nie poda argumentu przy wywołaniu. Na przykład `param([string]$Imie, [int]$Wiek = 18)` definiuje dwa parametry, z czego drugi ma wartość domyślną 18.

Uruchomienie skryptu z parametrami może odbywać się na dwa sposoby: przez jawne podanie nazwy parametru, co jest bezpieczniejsze i nie wymaga zachowania kolejności, lub przez podanie wartości w określonej kolejności, co jest szybsze, ale bardziej podatne na błędy. W profesjonalnych skryptach zaleca się stosowanie jawnych nazw parametrów oraz dodawanie atrybutów walidacyjnych, które sprawdzają poprawność wprowadzanych danych przed wykonaniem właściwego kodu.

27Zapis do pliku tekstowego

Zapisywanie danych do pliku

PowerShell oferuje kilka sposobów zapisu danych do pliku tekstowego.

Najważniejsze polecenia

  • Set-Content - tworzy nowy plik lub nadpisuje istniejący
  • Add-Content - dopisuje treść na końcu pliku
# Zapis pojedynczej linii (nadpisuje plik!)
# UWAGA: Jeśli plik istnieje, jego zawartość zostanie USUNIĘTA!
Set-Content -Path "C:\Temp\test.txt" -Value "Pierwsza linia"

# Zapis wielu linii na raz
# Tablica linii zostanie zapisana jako wiele linii w pliku
$dane = @("Linia 1", "Linia 2", "Linia 3")
Set-Content -Path "C:\Temp\test.txt" -Value $dane

# Dopisanie linii na końcu pliku
# Dodaje nową linię, nie usuwając istniejącej zawartości
Add-Content -Path "C:\Temp\test.txt" -Value "Nowa linia"

# Zapis z użyciem zmiennych
$imie = "Jan"
$data = Get-Date  # Pobiera aktualną datę i godzinę
Add-Content -Path "C:\Temp\log.txt" -Value "[$data] Użytkownik $imie się zalogował"

Set-Content NADPISUJE plik (usuwa starą zawartość). Add-Content DOPISUJE do istniejącej zawartości. Wybierz odpowiednie polecenie!

Zapis danych do pliku tekstowego w PowerShell jest realizowany za pomocą dwóch podstawowych poleceń: Set-Content oraz Add-Content. Pierwsze z nich tworzy nowy plik lub nadpisuje istniejący, co oznacza, że wcześniejsza zawartość pliku zostaje bezpowrotnie utracona. Add-Content z kolei dopisuje nową treść na końcu istniejącego pliku, co jest przydatne przy tworzeniu logów i raportów, gdzie chcemy zachować historię wpisów.

Przy zapisie danych warto pamiętać o kodowaniu znaków, które może być różne dla różnych systemów. Domyślnie PowerShell używa kodowania UTF-16, ale za pomocą parametru `-Encoding` można zmienić to na UTF-8, ASCII lub inne. Zapis danych do pliku jest jednym z najczęściej wykonywanych zadań w skryptach administracyjnych, szczególnie w kontekście raportowania i archiwizacji wyników. Warto także zwrócić uwagę na obsługę błędów związaną z brakiem uprawnień do zapisu w docelowej lokalizacji.

28Odczyt z pliku tekstowego

Czytanie danych z pliku

Podstawowym poleceniem do odczytu plików tekstowych jest Get-Content.

# Odczyt całego pliku
# Zmienna $zawartosc będzie zawierać tablicę linii
$zawartosc = Get-Content -Path "C:\Temp\test.txt"
Write-Host $zawartosc

# Odczyt z wyświetleniem numerów linii
# ReadCount to numer aktualnej linii
Get-Content -Path "C:\Temp\test.txt" | ForEach-Object {
    $numer = $_.ReadCount
    Write-Host "$numer : $_"
}
# Wynik:
# 1 : Pierwsza linia
# 2 : Druga linia

# Odczyt tylko pierwszych 5 linii
Get-Content -Path "C:\Temp\test.txt" -TotalCount 5

# Odczyt tylko ostatnich 3 linii (bardzo przydatne dla logów!)
Get-Content -Path "C:\Temp\log.txt" -Tail 3

# Odczyt jako tablica linii
$linie = Get-Content -Path "C:\Temp\test.txt"
Write-Host "Plik ma $($linie.Count) linii"

Parametr -Tail 3 jest bardzo przydatny do sprawdzania ostatnich wpisów w logach systemowych.

Odczyt danych z pliku tekstowego w PowerShell odbywa się przede wszystkim za pomocą polecenia Get-Content, które zwraca zawartość pliku w postaci tablicy linii. Dzięki temu każda linia pliku staje się osobnym elementem tablicy, co ułatwia dalsze przetwarzanie danych. Get-Content oferuje szereg przydatnych parametrów, takich jak `-TotalCount` do ograniczenia liczby odczytywanych linii oraz `-Tail` do pobrania ostatnich linii pliku, co jest szczególnie przydatne przy analizie logów.

Podczas pracy z dużymi plikami warto pamiętać, że Get-Content domyślnie wczytuje cały plik do pamięci, co może być problematyczne w przypadku plików o rozmiarze kilkuset megabajtów. W takich sytuacjach lepiej użyć polecenia `Get-Content -ReadCount 0` lub alternatywnie strumieniować dane za pomocą .NET StreamReader. Parametr `-Tail` jest optymalizowany do szybkiego odczytu końcowych fragmentów plików logów bez konieczności wczytywania całej zawartości do pamięci.

29Sprawdzanie istnienia pliku lub katalogu

Polecenie Test-Path

Sprawdza, czy podana ścieżka (plik lub katalog) istnieje. Zwraca $true lub $false.

# Sprawdzenie, czy plik istnieje
$sciezkaPliku = "C:\Windows\System32\notepad.exe"
if (Test-Path -Path $sciezkaPliku) {
    # Jeśli plik istnieje, wykonaj ten kod
    Write-Host "Plik istnieje!"
} else {
    # Jeśli plik nie istnieje, wykonaj ten kod
    Write-Host "Plik nie istnieje!"
}

# Sprawdzenie, czy katalog istnieje
# Parametr -PathType Container oznacza "katalog"
if (Test-Path -Path "C:\Temp" -PathType Container) {
    Write-Host "Katalog istnieje!"
}

# Sprawdzenie wielu ścieżek jednocześnie
# Pętla przejdzie przez każdy katalog z listy
$katalogi = @("C:\Windows", "C:\Program Files", "C:\NieIstnieje")
foreach ($k in $katalogi) {
    if (Test-Path $k) {
        Write-Host "$k - OK" -ForegroundColor Green
    } else {
        Write-Host "$k - NIE ZNALEZIONO" -ForegroundColor Red
    }
}

Zawsze sprawdzaj, czy plik/katalog istnieje przed próbą jego użycia! Inaczej skrypt zakończy się błędem.

Test-Path to jedno z najważniejszych poleceń warunkowych w PowerShell, które pozwala sprawdzić, czy dana ścieżka pliku lub katalogu istnieje w systemie plików. Wynikiem polecenia jest wartość logiczna $true lub $false, co pozwala na bezpośrednie użycie w instrukcjach warunkowych if-else. Dzięki Test-Path możesz zabezpieczyć swój skrypt przed próbą odczytu nieistniejącego pliku lub zapisu do nieistniejącego katalogu, co jest jedną z najczęstszych przyczyn błędów w skryptach.

Polecenie to oferuje także możliwość sprawdzenia konkretnego typu elementu za pomocą parametru `-PathType`, który przyjmuje wartości `Container` dla katalogów i `Leaf` dla plików. W połączeniu z iteracją po wielu ścieżkach, Test-Path pozwala na szybkie audyty dostępności zasobów na dysku. Jest to szczególnie przydatne w skryptach weryfikujących stan systemu przed wykonaniem krytycznych operacji, takich jak kopie zapasowe czy aktualizacje oprogramowania.

30Tworzenie i usuwanie plików oraz katalogów

Zarządzanie plikami i katalogami

  • New-Item - tworzy nowy plik lub katalog
  • Remove-Item - usuwa plik lub katalog
# Tworzenie katalogu
$katalog = "C:\Temp\MojeDane"
New-Item -Path $katalog -ItemType Directory

# Tworzenie pustego pliku tekstowego
$plik = "C:\Temp\MojeDane\test.txt"
New-Item -Path $plik -ItemType File

# Tworzenie pliku z zawartością (w jednej linii)
New-Item -Path "C:\Temp\MojeDane\opis.txt" -ItemType File -Value "To jest zawartość pliku"

# Usuwanie pliku
# Plik zostanie TRWALE usunięty (nie ma kosza!)
Remove-Item -Path "C:\Temp\MojeDane\test.txt"

# Usuwanie katalogu z całą zawartością
# -Recurse oznacza "również wszystkie pliki i podkatalogi w środku"
# -Force oznacza "nawet jeśli są zabezpieczone"
Remove-Item -Path "C:\Temp\MojeDane" -Recurse -Force

Usunięte pliki NIE trafią do Kosza - zostaną usunięte definitywnie! Dlatego zawsze sprawdzaj ścieżkę przed Remove-Item.

Uwaga: Polecenie Remove-Item z parametrem -Recurse usuwa wszystkie pliki i podkatalogi!

Zarządzanie plikami i katalogami w PowerShell odbywa się za pomocą poleceń New-Item i Remove-Item, które są odpowiednikami funkcji tworzenia i usuwania w Eksploratorze Windows. New-Item wymaga podania ścieżki oraz typu elementu: `-ItemType Directory` dla katalogu lub `-ItemType File` dla pliku. Dodatkowo można od razu podać zawartość pliku za pomocą parametru `-Value`, co pozwala na tworzenie plików z treścią w jednym poleceniu.

Remove-Item to potężne, ale niebezpieczne polecenie, ponieważ domyślnie usuwa pliki bez przenoszenia ich do Kosza i bez pytania o potwierdzenie. Parametr `-Recurse` usuwa całe drzewo katalogów wraz z wszystkimi plikami, a `-Force` wymusza usunięcie nawet zabezpieczonych lub ukrytych elementów. Z tego powodu przed wywołaniem Remove-Item zawsze warto upewnić się, że operujemy na poprawnej ścieżce, najlepiej po uprzednim sprawdzeniu jej poleceniem Test-Path.

31Lista plików w katalogu

Polecenie Get-ChildItem

Służy do wyświetlania zawartości katalogu - listy plików i podkatalogów.

Przydatne parametry

  • -Filter - filtr według wzorca (np. "*.txt")
  • -Recurse - przeszukuj też podkatalogi
  • -File - tylko pliki
  • -Directory - tylko katalogi
# Lista plików w bieżącym katalogu (tam gdzie jesteś)
Get-ChildItem

# Lista wszystkich elementów (w tym ukryte pliki systemowe)
Get-ChildItem -Force

# Lista tylko plików (bez katalogów)
Get-ChildItem -File

# Lista tylko katalogów (bez plików)
Get-ChildItem -Directory

# Lista plików z filtrem - tylko pliki .txt
Get-ChildItem -Filter "*.txt"

# Lista z podkatalogów - przeszukaj rekursywnie
Get-ChildItem -Recurse

# Szukanie największych plików
# Sort-Object według rozmiaru (malejąco), weź pierwsze 10
Get-ChildItem -File | Sort-Object Length -Descending | Select-Object -First 10

Filter "*.txt" oznacza "dowolna nazwa, ale rozszerzenie musi być .txt". Symbol * zastępuje dowolny tekst.

Get-ChildItem to odpowiednik poleceń `ls` z BASH i `dir` z CMD, ale oferujący znacznie więcej możliwości dzięki obiektowemu podejściu PowerShell. Polecenie to wyświetla zawartość wskazanego katalogu, a każdy zwrócony element jest obiektem z właściwościami takimi jak Name, Length, LastWriteTime czy Attributes. Dzięki temu wyniki można natychmiast filtrować, sortować i przekształcać bez konieczności dodatkowego przetwarzania tekstu.

Parametry takie jak `-File`, `-Directory`, `-Filter` i `-Recurse` pozwalają na precyzyjne określenie kryteriów wyszukiwania. Na przykład `Get-ChildItem -File -Filter "*.txt" -Recurse` znajdzie wszystkie pliki tekstowe w bieżącym katalogu i wszystkich podkatalogach. Get-ChildItem jest również często używany w połączeniu z Sort-Object i Select-Object do identyfikacji największych plików na dysku, co jest przydatne przy audytach przestrzeni dyskowej.

32Operatory porównania

Podstawowe operatory

Operatory porównania służą do sprawdzania relacji między wartościami.

  • -eq - równe (equal)
  • -ne - różne (not equal)
  • -gt - większe niż (greater than)
  • -lt - mniejsze niż (less than)
  • -ge - większe lub równe
  • -le - mniejsze lub równe
# Przykłady porównań
$a = 10
$b = 20

# Sprawdzenie równości (czy równe?)
if ($a -eq $b) { 
    "Równe" 
} else { 
    "Różne" 
}
# Wynik: Różne (bo 10 nie jest równe 20)

# Porównania liczbowe - zwracają $true lub $false
$a -gt 5    # True (10 > 5)
$a -lt 15   # True (10 < 15)
$a -ge 10   # True (10 >= 10)
$a -le 10   # True (10 <= 10)

# Porównania tekstowe
"kot" -eq "kot"   # True (teksty są identyczne)
"kot" -like "k*"  # True (wildcard: zaczyna się od "k")
"kot" -like "*t"  # True (wildcard: kończy się na "t")

Operator -like z wildcard (*) pozwala na porównywanie z wzorcem. * oznacza "dowolny tekst".

Operatory porównania w PowerShell różnią się znacznie od tych znanych z innych języków programowania, głównie ze względu na specyficzną składnię z myślnikiem na początku. Operator `-eq` sprawdza równość, `-ne` nierówność, `-gt` większość, a `-lt` mniejszość. Ta konwencja, choć na początku może wydawać się nietypowa, zapobiega pomyłkom z operatorem przypisania `=`, który w PowerShell również jest używany, podobnie jak w innych językach.

Operatory `-like` i `-notlike` pozwalają na porównywanie z użyciem symboli wieloznacznych, co jest przydatne przy filtrowaniu nazw plików czy tekstów. Operator `-match` umożliwia zaawansowane dopasowania z użyciem wyrażeń regularnych, które otwierają ogromne możliwości wyszukiwania wzorców w danych tekstowych. Dla administratorów pracujących z dużymi zbiorami danych, znajomość operatorów porównania jest niezbędna do efektywnego filtrowania i selekcji informacji.

33Operatory logiczne

Łączenie warunków

Operatory logiczne pozwalają łączyć wiele warunków w jednym wyrażeniu.

  • -and - oba warunki muszą być prawdziwe (iloczyn)
  • -or - przynajmniej jeden warunek musi być prawdziwy (suma)
  • -not lub ! - zaprzeczenie warunku
# Operator AND (i) - oba muszą być spełnione
$wiek = 25
$maPrawoJazdy = $true
if ($wiek -ge 18 -and $maPrawoJazdy) {
    Write-Host "Możesz prowadzić samochód"
}
# Wynik: Zostanie wyświetlone (obie warunki spełnione)

# Operator OR (lub) - przynajmniej jeden musi być spełniony
$jestStudentem = $true
$jestEmerytem = $false
if ($jestStudentem -or $jestEmerytem) {
    Write-Host "Przysługuje Ci zniżka"
}
# Wynik: Zostanie wyświetlone (przynajmniej jeden warunek spełniony)

# Operator NOT (nie) - odwraca wartość warunku
$czyPadaDeszcz = $false
if (-not $czyPadaDeszcz) {
    Write-Host "Możesz iść na spacer"
}
# Wynik: Zostanie wyświetlone (bo warunek był fałszywy, NOT go odwrócił)

AND wymaga, żeby WSZYSTKIE warunki były true. OR wymaga, żeby PRZYNAJMNIEJ JEDEN warunek był true. NOT odwraca true na false i odwrotnie.

Operatory logiczne w PowerShell służą do łączenia wielu warunków w jednym wyrażeniu, co pozwala na konstruowanie złożonych zapytań i warunków decyzyjnych. Operator `-and` wymaga spełnienia wszystkich połączonych warunków, `-or` wymaga spełnienia przynajmniej jednego, a `-not` zaprzecza danemu warunkowi. W przeciwieństwie do innych języków PowerShell używa słownych operatorów zamiast symboli `&&`, `||`, `!`, co poprawia czytelność kodu kosztem większej ilości pisania.

Łączenie operatorów porównania z operatorami logicznymi pozwala na tworzenie bardzo precyzyjnych warunków w instrukcjach if, pętlach while oraz w filtrach Where-Object. Przykładowo warunek `($wiek -ge 18 -and $maPrawoJazdy)` sprawdza jednocześnie pełnoletność i posiadanie prawa jazdy. Umiejętne stosowanie operatorów logicznych jest kluczowe przy budowaniu złożonych logik warunkowych w skryptach automatyzujących procesy decyzyjne.

34Instrukcja warunkowa if / elseif / else

Budowa instrukcji warunkowej

Instrukcja if pozwala wykonać różny kod w zależności od spełnienia warunku.

# Przykład z ocenami - system oceniania
$ocena = 4

if ($ocena -ge 5) {
    # Jeśli ocena >= 5, wykonaj ten blok
    Write-Host "Celujący!"
} elseif ($ocena -ge 4) {
    # Jeśli ocena >= 4 (ale < 5), wykonaj ten blok
    Write-Host "Bardzo dobry"
} elseif ($ocena -ge 3) {
    # Jeśli ocena >= 3 (ale < 4), wykonaj ten blok
    Write-Host "Dobry"
} else {
    # Jeśli żaden z powyższych warunków nie był spełniony
    Write-Host "Niedostateczny"
}
# Wynik: Bardzo dobry (bo 4 >= 4)

# Sprawdzenie parzystości liczby
$liczba = 7
if ($liczba % 2 -eq 0) {
    # Operator % to modulo (reszta z dzielenia)
    # Jeśli 7 % 2 = 1 (nie 0), to liczba jest NIEPARZYSTA
    Write-Host "$liczba jest parzysta"
} else {
    Write-Host "$liczba jest nieparzysta"
}
# Wynik: 7 jest nieparzysta

PowerShell sprawdza warunki po kolei. Gdy znajdzie pierwszy spełniony warunek, wykonuje jego kod i pomija resztę.

Instrukcja warunkowa if-elseif-else stanowi fundament logiki decyzyjnej w PowerShell i pozwala na wykonywanie różnych bloków kodu w zależności od spełnienia określonych warunków. PowerShell sprawdza warunki w kolejności ich występowania od góry do dołu i wykonuje kod tylko dla pierwszego spełnionego warunku, a następnie pomija wszystkie pozostałe bloki. Dzięki temu można budować hierarchiczne struktury decyzyjne, gdzie każdy kolejny warunek jest sprawdzany tylko wtedy, gdy poprzednie nie zostały spełnione.

W praktyce administratorzy często używają if-else do walidacji danych wejściowych, sprawdzania stanu usług systemowych czy podejmowania decyzji na podstawie wyników poleceń. W przypadku prostych warunków można użyć skróconej składni ternary operator, dostępnej w PowerShell 7 jako `$result = $warunek ? $wartoscTrue : $wartoscFalse`. Dla bardziej złożonych przypadków z wieloma możliwymi wartościami lepiej sprawdza się instrukcja switch, która jest czytelniejsza niż rozbudowane łańcuchy elseif.

35Instrukcja wyboru: switch

Kiedy używać switch?

Gdy masz wiele możliwych wartości i dla każdej chcesz wykonać inny kod. Switch jest czytelniejszy niż wiele elseif.

# Przykład: sprawdzenie dnia tygodnia
# Pobierz aktualny dzień tygodnia (po angielsku)
$dzien = (Get-Date).DayOfWeek

switch ($dzien) {
    # Sprawdź każdy możliwy przypadek
    "Monday"    { Write-Host "Poniedziałek - czas zacząć tydzień!" }
    "Tuesday"   { Write-Host "Wtorek - jeszcze daleko do weekendu" }
    "Wednesday" { Write-Host "Środa - połowa tygodnia" }
    "Thursday"  { Write-Host "Czwartek - już prawie weekend!" }
    "Friday"    { Write-Host "Piątek - już weekend!" }
    "Saturday"  { Write-Host "Sobota - czas odpoczywać!" }
    "Sunday"    { Write-Host "Niedziela - niedziela!" }
    # default wykonuje się, gdy żaden przypadek nie pasuje
    default     { Write-Host "Nieznany dzień" }
}

# Przykład: rozpoznawanie typu pliku po rozszerzeniu
$plik = "dokument.pdf"
switch -Wildcard ($plik) {
    # Wildcard (* = dowolny tekst)
    "*.txt"     { Write-Host "Plik tekstowy" }
    "*.pdf"     { Write-Host "Dokument PDF" }
    "*.doc*"    { Write-Host "Dokument Word (doc lub docx)" }
    "*.xls*"    { Write-Host "Arkusz Excel" }
    default     { Write-Host "Nieznany typ pliku" }
}

Switch jest jak rozdzielnik - sprawdza wartość i kieruje do odpowiedniego "toru". Gdy masz więcej niż 2-3 warunki elseif, rozważ użycie switch.

Instrukcja switch w PowerShell jest eleganckim zamiennikiem długich łańcuchów elseif i sprawdza się doskonale w sytuacjach, gdy mamy do czynienia z wieloma możliwymi wartościami tej samej zmiennej. Switch przegląda kolejne przypadki i wykonuje kod dla pierwszego pasującego dopasowania, a opcjonalnie także dla wszystkich pasujących, jeśli użyjemy flagi. Domyślnie switch używa porównania dokładnego, ale można go skonfigurować do pracy z wyrażeniami regularnymi za pomocą flagi -Regex lub z symbolami wieloznacznymi za pomocą -Wildcard.

Przykład z parsowaniem rozszerzeń plików `switch -Wildcard ($plik)` pokazuje praktyczne zastosowanie tej instrukcji w codziennej administracji. Switch świetnie sprawdza się także przy obsłudze kodów błędów, komend menu czy stanów maszyny. W odróżnieniu od if-elseif, switch jest bardziej zwięzły i czytelny, szczególnie gdy liczba przypadków przekracza trzy lub cztery. W takich sytuacjach zdecydowanie warto preferować switch nad rozbudowanymi strukturami elseif.

36Pętla: foreach

Co to jest pętla?

Pętla pozwala wielokrotnie wykonać ten sam kod, przechodząc przez kolekcję elementów.

Pętla foreach

Przechodzi przez każdy element kolekcji i wykonuje dla niego kod.

# Przechodzenie przez tablicę owoców
$owoce = @("jabłko", "banan", "pomarańcza")

# foreach przechodzi przez każdy element tablicy
foreach ($owoc in $owoce) {
    # Dla każdego owoca wykonaj ten kod
    Write-Host "Lubię jeść: $owoc"
}
# Wynik:
# Lubię jeść: jabłko
# Lubię jeść: banan
# Lubię jeść: pomarańcza

# Obliczanie sumy liczb
$liczby = @(10, 20, 30, 40, 50)
$suma = 0  # Zaczynamy od zera
foreach ($liczba in $liczby) {
    $suma += $liczba  # Dodaj każdą liczbę do sumy
}
Write-Host "Suma: $suma"  # Wynik: 150

# Przechodzenie przez wyniki polecenia
# Pobierz 3 pierwsze procesy i przejdź przez nie
foreach ($proc in Get-Process | Select-Object -First 3) {
    Write-Host "Proces: $($proc.Name)"
}

Pamiętaj: zmienna w pętli (tu: $owoc) przyjmuje kolejno wartości każdego elementu. Możesz ją nazwać dowolnie - $element, $item, $cos itp.

Pętla foreach w PowerShell jest podstawowym mechanizmem iteracji po elementach kolekcji i stanowi jeden z najczęściej używanych elementów języka. Składnia `foreach ($element in $kolekcja)` pozwala na przejście przez każdy element tablicy, listy lub wyniku polecenia i wykonanie na nim określonych operacji. W przeciwieństwie do pętli for, która wymaga jawnego zarządzania licznikiem, foreach automatycznie przechodzi przez wszystkie elementy kolekcji, co czyni ją bezpieczniejszą i łatwiejszą w użyciu.

Pętla foreach może operować zarówno na zmiennych przechowujących kolekcje, jak i bezpośrednio na wynikach poleceń umieszczonych w nawiasie. Na przykład `foreach ($proc in Get-Process | Select-Object -First 3)` pobiera pierwsze trzy procesy i dla każdego z nich wykonuje blok kodu. Wewnątrz pętli można odwoływać się do zmiennej sterującej, która przyjmuje kolejno wartości wszystkich elementów kolekcji, co pozwala na elastyczne przetwarzanie danych.

37Pętla: for

Kiedy używać pętli for?

Gdy znasz dokładną liczbę powtórzeń lub chcesz mieć kontrolę nad licznikiem pętli.

# Wypisz liczby od 1 do 5
# for (start; warunek; krok)
for ($i = 1; $i -le 5; $i++) {
    # $i++ oznacza: zwiększ $i o 1 po każdym obiegu
    Write-Host "Licznik: $i"
}
# Wynik: 1, 2, 3, 4, 5

# Wypisz tylko liczby parzyste od 2 do 10
for ($i = 2; $i -le 10; $i += 2) {
    # $i += 2 oznacza: zwiększ $i o 2
    Write-Host "Liczba parzysta: $i"
}
# Wynik: 2, 4, 6, 8, 10

# Odliczanie od 10 do 1 (potem START!)
for ($i = 10; $i -ge 1; $i--) {
    # $i-- oznacza: zmniejsz $i o 1
    Write-Host "Odliczanie: $i..."
}
Write-Host "START!"
# Wynik: 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, START!

$i++ to skrót od $i = $i + 1. $i-- to skrót od $i = $i - 1. Te operatory nazywamy inkrementacją i dekrementacją.

Pętla for w PowerShell jest przydatna w sytuacjach, gdy znamy dokładną liczbę iteracji lub chcemy mieć precyzyjną kontrolę nad licznikiem pętli. Składnia `for (inicjalizacja; warunek; krok)` pozwala na zdefiniowanie zmiennej startowej, warunku kontynuacji oraz operacji wykonywanej po każdej iteracji. Jest to szczególnie przydatne przy odliczaniu w dół, generowaniu sekwencji liczb czy operacjach na tablicach wymagających znajomości indeksu bieżącego elementu.

Mimo że foreach jest wygodniejszy w większości przypadków, pętla for daje większą kontrolę nad przebiegiem iteracji. Dla przykładu `for ($i = 10; $i -ge 1; $i--)` odlicza od dziesięciu do jeden, co jest trudniejsze do zrealizowania za pomocą foreach. W praktyce administracyjnej pętla for znajduje zastosowanie w operacjach na macierzach, tabelach i wszędzie tam, gdzie istotna jest pozycja indeksu przetwarzanego elementu.

38Pętle: while i do-while

Pętla while

Wykonuje kod dopóki warunek jest prawdziwy. Jeśli warunek od początku jest fałszywy, kod może się nie wykonać w ogóle.

Pętla do-while

Zawsze wykonuje kod przynajmniej raz, a potem sprawdza warunek.

# Pętla while - odliczanie
$licznik = 5
while ($licznik -gt 0) {
    # Dopóki licznik > 0, wykonuj kod
    Write-Host "Zostało: $licznik"
    $licznik--  # Zmniejsz licznik o 1
}
Write-Host "Koniec!"
# Wynik: Zostało: 5, 4, 3, 2, 1, Koniec!

# Pętla do-while - zawsze wykonuje się przynajmniej raz
# Pytaj użytkownika, aż poda "t" (tak)
do {
    # Ten kod wykona się ZAWSZE przynajmniej raz
    $odpowiedz = Read-Host "Czy chcesz kontynuować? (t/n)"
} while ($odpowiedz -ne "t")
# Pętla trwa, dopóki odpowiedź jest różna od "t"
Write-Host "Kontynuujemy!"

# UWAGA: do-while wykonuje się zawsze przynajmniej raz,
# nawet jeśli warunek jest fałszywy od początku!

Używaj while, gdy nie wiesz ile razy pętla się wykona (np. czekasz na określony stan). Używaj do-while, gdy kod musi się wykonać przynajmniej raz.

Pętle while i do-while w PowerShell są używane w sytuacjach, gdy liczba iteracji nie jest znana z góry i zależy od warunku sprawdzanego w trakcie wykonywania. Pętla while sprawdza warunek przed każdą iteracją i jeśli jest on fałszywy od samego początku, kod wewnątrz pętli może nie wykonać się ani razu. Jest to idealne rozwiązanie dla zadań takich jak oczekiwanie na określony stan systemu czy pobieranie danych do momentu spełnienia kryterium zakończenia.

Pętla do-while różni się od while tym, że sprawdza warunek po wykonaniu bloku kodu, co gwarantuje przynajmniej jednokrotne wykonanie zawartości. Ta różnica ma znaczenie w przypadkach, gdy kod musi wykonać się niezależnie od spełnienia warunku zakończenia. Przykładem może być pętla pobierająca dane od użytkownika i powtarzająca pytanie aż do uzyskania poprawnej odpowiedzi. Wybór między while a do-while zależy od konkretnego przypadku użycia i wymaganej logiki działania.

39Filtrowanie: Where-Object

Do czego służy Where-Object?

Pozwala odfiltrować elementy z kolekcji, pozostawiając tylko te, które spełniają warunek.

Składnia

Kolekcja | Where-Object { warunek }

Zmienna $_ reprezentuje aktualnie przetwarzany element.

# Znajdź procesy, które używają więcej niż 10 CPU
# $_ to aktualny proces w potoku
Get-Process | Where-Object { $_.CPU -gt 10 }

# Znajdź usługi, które są uruchomione (Status = Running)
Get-Service | Where-Object { $_.Status -eq "Running" }

# Uproszczona składnia (PowerShell 3.0+) - bez $_
# Możesz pisać krócej:
Get-Process | Where-Object CPU -gt 10
Get-Service | Where-Object Status -eq "Running"

# Wiele warunków jednocześnie (AND)
Get-Process | Where-Object { 
    ($_.CPU -gt 10) -and ($_.WorkingSet -gt 100MB) 
}
# Wynik: procesy, które spełniają OBA warunki jednocześnie

Where-Object działa jak sito - przepuszcza tylko elementy spełniające warunek. Wszystkie inne są "odfiltrowane" i nie trafiają dalej w potoku.

Where-Object to cmdlet filtrujący, który jest nieodłącznym elementem potoku PowerShell i służy do wybierania tylko tych obiektów, które spełniają określony warunek. Składnia `Where-Object { $_ -gt 10 }` wykorzystuje zmienną `$_` do reprezentowania bieżącego obiektu w potoku oraz operator porównania do sprawdzenia warunku. W PowerShell 3.0 i nowszych dostępna jest także uproszczona składnia `Where-Object CPU -gt 10`, która jest bardziej zwięzła i czytelna.

Mimo że Where-Object jest wygodny w użyciu, przy bardzo dużych kolekcjach może działać wolniej niż wbudowane parametry filtrujące wielu poleceń. Na przykład Get-Process bez filtrowania na liście procesów wszystkich, a dopiero Where-Object wybiera interesujące nas elementy. W sytuacjach krytycznych pod względem wydajności warto sprawdzić, czy dane polecenie nie oferuje własnego parametru filtrującego, który zadziała szybciej niż przetwarzanie w potoku.

40Wybieranie: Select-Object

Co robi Select-Object?

Pozwala wybrać określone właściwości obiektów lub pierwsze/ostatnie elementy kolekcji.

# Wybór tylko określonych właściwości (kolumn)
# Zamiast wszystkich danych, weź tylko Name, Id i CPU
Get-Process | Select-Object Name, Id, CPU

# Pierwsze 5 elementów
Get-Process | Select-Object -First 5

# Ostatnie 5 elementów
Get-Process | Select-Object -Last 5

# Tworzenie nowej właściwości (obliczona)
# Konwertuj pamięć z bajtów na megabajty
Get-Process | Select-Object Name, @{Name="MemoryMB"; Expression={$_.WorkingSet / 1MB}}

# Sortowanie i wybór TOP 5 największych procesów
Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 5

@{Name="..."; Expression={...}} tworzy nową właściwość o nazwie "MemoryMB", której wartość jest obliczana przez wyrażenie w nawiasie klamrowym.

Select-Object to wszechstronne polecenie służące do wybierania określonych właściwości obiektów oraz ograniczania liczby elementów w kolekcji. Najczęstsze zastosowanie to wyświetlanie tylko wybranych kolumn z wyników polecenia, na przykład `Get-Process | Select-Object Name, Id, CPU`. Dzięki temu można ograniczyć ilość wyświetlanych danych tylko do interesujących nas informacji, co poprawia czytelność wyników w konsoli.

Parametry `-First` i `-Last` pozwalają na pobranie odpowiednio pierwszych lub ostatnich N elementów kolekcji, co jest przydatne przy szybkim podglądzie danych. Select-Object umożliwia także tworzenie nowych, obliczonych właściwości za pomocą hashy `@{Name="..."; Expression={...}}`, co pozwala na przekształcanie danych w locie bez konieczności definiowania osobnych zmiennych. To czyni Select-Object nie tylko narzędziem do selekcji, ale także do transformacji danych.

41Sortowanie: Sort-Object

Sortowanie elementów

Pozwala posortować elementy kolekcji według określonej właściwości.

# Sortowanie rosnące (domyślne) - od najmniejszego do największego
Get-Process | Sort-Object CPU

# Sortowanie malejące - od największego do najmniejszego
Get-Process | Sort-Object CPU -Descending

# Sortowanie po wielu właściwościach jednocześnie
# Najpierw sortuj po WorkingSet, potem po CPU
Get-Process | Sort-Object { $_.WorkingSet }, CPU -Descending

# Sortowanie tekstów alfabetycznie
$imiona = @("Kasia", "Ania", "Basia", "Ewa")
$imiona | Sort-Object
# Wynik: Ania, Basia, Ewa, Kasia (alfabetycznie)

# Sortowanie liczb
$liczby = @(5, 2, 8, 1, 9)
$liczby | Sort-Object
# Wynik: 1, 2, 5, 8, 9 (rosnąco)

# Sortowanie liczb malejąco
$liczby | Sort-Object -Descending
# Wynik: 9, 8, 5, 2, 1

Domyślnie Sort-Object sortuje rosnąco (A-Z, 1-9). Dodaj -Descending, aby sortować malejąco (Z-A, 9-1).

Sort-Object to cmdlet porządkujący elementy kolekcji według jednej lub wielu właściwości, zarówno rosnąco, jak i malejąco. Domyślnie sortowanie odbywa się w kolejności rosnącej, a dodanie parametru `-Descending` odwraca tę kolejność. Sort-Object może sortować zarówno proste wartości, jak liczby czy teksty, jak i złożone obiekty według wskazanej właściwości, na przykład `Get-Process | Sort-Object CPU -Descending` posortuje procesy według zużycia procesora od największego do najmniejszego.

W przypadku sortowania według wielu właściwości, Sort-Object stosuje kolejno każdą z nich jako kryterium porządkujące. Najpierw elementy są sortowane według pierwszej właściwości, a w przypadku równej wartości decyduje kolejna właściwość. Sortowanie tekstów odbywa się domyślnie alfabetycznie, a liczb według wartości numerycznej. Sort-Object jest często używany w połączeniu z Select-Object -First do znajdowania ekstremalnych wartości w zbiorach danych.

42Akcje na elementach: ForEach-Object

Różnica między foreach i ForEach-Object

  • foreach - słowo kluczowe języka, szybsze, poza potokiem
  • ForEach-Object - cmdlet, działa w potoku
# ForEach-Object w potoku - skrót %
# Wyświetl nazwy wszystkich procesów
Get-Process | ForEach-Object { Write-Host $_.Name }

# Skrócony zapis (symbol %)
Get-Process | % { Write-Host $_.Name }

# Złożona akcja - dla każdego procesu wykonaj wiele operacji
Get-Process | ForEach-Object {
    # Pobierz dane procesu
    $name = $_.Name
    $cpu = [math]::Round($_.CPU, 2)  # Zaokrąglij do 2 miejsc
    
    # Wyświetl sformatowany tekst
    Write-Host "Proces '$name' używa $cpu sekund CPU"
}

Gdy pracujesz w potoku (po |), używaj ForEach-Object lub %. Gdy masz już dane w zmiennej, używaj foreach.

ForEach-Object to cmdlet wykonujący określony blok kodu dla każdego obiektu przekazanego przez potok, co odróżnia go od słowa kluczowego foreach, które działa poza potokiem. Składnia `Get-Process | ForEach-Object { Write-Host $_.Name }` przetwarza każdy proces i wyświetla jego nazwę, przy czym zmienna $_ reprezentuje aktualnie przetwarzany obiekt. ForEach-Object obsługuje także skróconą notację `%` zamiast pełnej nazwy, co jest często używane w interaktywnej pracy.

Wybór między foreach a ForEach-Object zależy od kontekstu. Gdy masz już dane w zmiennej, foreach jest szybszy i bardziej czytelny. Gdy pracujesz w potoku, ForEach-Object jest naturalnym wyborem, ponieważ bezpośrednio przetwarza strumień danych. ForEach-Object obsługuje także trzy wbudowane bloki: `-Begin` wykonywany przed pierwszym elementem, `-Process` dla każdego elementu i `-End` po ostatnim elemencie, co pozwala na bardziej zaawansowane przetwarzanie.

43Tworzenie funkcji

Co to jest funkcja?

Funkcja to nazwana grupa poleceń, którą można wywołać wielokrotnie. Pozwala na organizację i wielokrotne użycie kodu.

# Prosta funkcja - bez parametrów
function SayHello {
    # Cały kod funkcji w nawiasach klamrowych
    Write-Host "Cześć! Witaj w PowerShell!"
}

# Wywołanie funkcji - po prostu wpisz jej nazwę
SayHello  # Wyświetli: Cześć! Witaj w PowerShell!
SayHello  # Możesz wywołać wielokrotnie

# Funkcja z parametrem
function Przywitania {
    param($imie)  # Parametr o nazwie $imie
    Write-Host "Cześć, $imie!"
}

# Wywołanie z parametrem
Przywitania -imie "Anna"   # Wynik: Cześć, Anna!
Przywitania -imie "Jan"     # Wynik: Cześć, Jan!

# Funkcja zwracająca wartość
function Dodaj {
    param($a, $b)
    # return zwraca wartość
    return $a + $b
}

# Pobierz wynik funkcji
$wynik = Dodaj -a 5 -b 3
Write-Host "5 + 3 = $wynik"  # Wynik: 5 + 3 = 8

Funkcje pozwalają "zapakować" kod, żeby używać go wielokrotnie. Zamiast pisać ten sam kod wielokrotnie, wywołujesz funkcję.

Wskazówka: Nazywaj funkcje zgodnie z konwencją PowerShell - Czasownik-Rzeczownik, np. Get-UserInfo.

Funkcje w PowerShell to podstawowy mechanizm organizacji kodu, który pozwala na grupowanie powiązanych poleceń pod jedną nazwą i wielokrotne ich wywoływanie. Definiowanie funkcji za pomocą słowa kluczowego function, na przykład `function SayHello { Write-Host "Cześć!" }`, tworzy wielokrotnego użytku blok kodu, który można wywołać przez podanie jego nazwy. Funkcje mogą przyjmować parametry, co czyni je elastycznymi i dostosowanymi do różnych scenariuszy użycia.

Funkcje w PowerShell mogą także zwracać wartości za pomocą słowa kluczowego `return`, co pozwala na używanie ich jako elementów większych wyrażeń. W odróżnieniu od innych języków, w PowerShell wartość zwracana jest także każdy obiekt, który nie został przypisany do zmiennej ani przekazany dalej w potoku. Dobrą praktyką jest nazywanie funkcji zgodnie z konwencją Czasownik-Rzeczownik, co zapewnia spójność z wbudowanymi cmdletami i ułatwia innym programistom zrozumienie przeznaczenia funkcji.

44Zaawansowane parametry funkcji

Blok param()

Pozwala na zaawansowane definiowanie parametrów - z typami, wartościami domyślnymi, walidacją.

# Funkcja z wieloma parametrami i wartościami domyślnymi
function Powitanie {
    param(
        [string]$Imie = "Gościu",      # Parametr tekstowy z domyślną wartością
        [int]$Wiek = 18,                # Parametr liczbowy z domyślną wartością
        [switch]$JestEmerytem            # Przełącznik (switch) - albo jest, albo nie
    )
    
    Write-Host "Cześć, $Imie!"
    Write-Host "Masz $Wiek lat."
    
    # Jeśli przełącznik -JestEmerytem został podany, wykonaj kod
    if ($JestEmerytem) {
        Write-Host "Jesteś emerytem!"
    }
}

# Różne sposoby wywołania:

# Wszystkie parametry
Powitanie -Imie "Anna" -Wiek 65 -JestEmerytem
# Wynik: Cześć, Anna! Masz 65 lat. Jesteś emerytem!

# Tylko niektóre parametry
Powitanie -Imie "Kasia" -Wiek 25
# Wynik: Cześć, Kasia! Masz 25 lat.

# Tylko z domyślnymi wartościami
Powitanie
# Wynik: Cześć, Gościu! Masz 18 lat.

Switch to specjalny typ parametru - gdy go podasz, ma wartość $true, gdy nie podasz, ma wartość $false. Używaj do opcji typu "włącz/wyłącz".

Zaawansowane parametry funkcji w PowerShell pozwalają na precyzyjne kontrolowanie, jakie dane może przyjąć funkcja i jakie są domyślne wartości poszczególnych argumentów. Blok `param()` zdefiniowany na początku funkcji może zawierać parametry z jawnie określonym typem, wartością domyślną oraz dodatkowymi atrybutami walidacyjnymi. Typ `[switch]` jest specjalnym typem parametru, który zachowuje się jak przełącznik: gdy zostanie podany, ma wartość $true, a gdy go zabraknie, $false.

Dzięki wartościom domyślnym funkcje stają się bardziej elastyczne i bezpieczniejsze w użyciu, ponieważ nawet jeśli użytkownik nie poda wszystkich argumentów, funkcja będzie mogła działać z rozsądnymi domyślnymi ustawieniami. Atrybut `[Parameter(Mandatory=$true)]` wymusza podanie danego parametru, a atrybuty walidacyjne, takie jak `[ValidateRange(1,100)]` czy `[ValidateSet("opcja1","opcja2")]`, automatycznie sprawdzają poprawność danych wejściowych, co eliminuje konieczność ręcznej walidacji wewnątrz funkcji.

45Obsługa błędów: Try i Catch

Do czego służy Try/Catch?

Pozwala przechwycić błędy i zareagować na nie w kontrolowany sposób. Zamiast awaryjnego zatrzymania, skrypt może się "zabezpieczyć".

Jak działa?

  • Try - kod, który może spowodować błąd
  • Catch - kod wykonany, gdy wystąpi błąd
  • Finally - kod wykonany zawsze (nawet przy błędzie)
# Próba odczytu nieistniejącego pliku
try {
    # Ten kod może spowodować błąd
    # -ErrorAction Stop wymusza zgłoszenie błędu
    $zawartosc = Get-Content -Path "C:\NieIstnieje\plik.txt" -ErrorAction Stop
    Write-Host "Plik istnieje: $zawartosc"
}
catch {
    # Ten kod wykona się TYLKO gdy wystąpi błąd
    Write-Host "BŁĄD: Nie można odczytać pliku!" -ForegroundColor Red
    # $_ to obiekt błędu z szczegółami
    Write-Host "Szczegóły: $($_.Exception.Message)"
}
finally {
    # Ten kod wykona się ZAWSZE - niezależnie od błędu
    Write-Host "Koniec operacji."
}

Try/Catch to "sieć bezpieczeństwa" dla skryptu. Gdy coś pójdzie nie tak, skrypt nie zawiesi się, tylko wykona kod w bloku Catch.

Obsługa błędów za pomocą try-catch-finally w PowerShell to mechanizm, który pozwala na kontrolowane reagowanie na wyjątki bez przerywania działania skryptu. Blok `try` zawiera kod, który może potencjalnie spowodować błąd, `catch` przechwytuje wyjątek i wykonuje kod naprawczy, a `finally` wykonuje się zawsze, niezależnie od tego, czy błąd wystąpił, czy nie. Dzięki temu skrypt może elegancko obsłużyć sytuacje awaryjne, takie jak brak pliku, brak uprawnień czy nieprawidłowe dane wejściowe.

Aby try-catch działał poprawnie, polecenia wewnątrz bloku try muszą być wywołane z parametrem `-ErrorAction Stop`, który wymusza zgłoszenie wyjątku zamiast cichego kontynuowania. W przeciwnym razie PowerShell domyślnie kontynuuje działanie nawet po wystąpieniu błędu. W bloku catch zmienna `$_` zawiera obiekt błędu z właściwościami takimi jak Exception.Message, co pozwala na wyświetlenie szczegółowych informacji o przyczynie problemu i odpowiednie zareagowanie na zaistniałą sytuację.

46Operatory łańcuchowe i specjalne

Przydatne operatory

  • -match - sprawdza, czy tekst pasuje do wzorca
  • -replace - zamienia fragment tekstu
  • -in / -notin - sprawdza, czy element jest w kolekcji
  • -contains - sprawdza, czy kolekcja zawiera element
# Operator -match - wyszukiwanie wzorca w tekście (wyrażenie regularne)
$tekst = "Mój email to jan@example.com"
if ($tekst -match '\S+@\S+\.\S+') {
    Write-Host "Znaleziono adres email!"
}
# Wzorzec \S+@\S+\.\S+ oznacza: tekst@tekst.tekst

# Operator -replace - zamiana tekstu
$tekst = "Cześć Jan!"
$nowy = $tekst -replace "Jan", "Anna"
Write-Host $nowy  # Wynik: Cześć Anna!

# Zamień wszystkie cyfry na X
$tekst = "Mam 5 jabłek i 3 gruszki"
$tekst -replace '\d', 'X'
# Wynik: Mam X jabłek i X gruszek

# Operator -in - sprawdza, czy element jest w tablicy
$kolory = @("czerwony", "zielony", "niebieski")
if ("czerwony" -in $kolory) {
    Write-Host "Czerwony jest na liście!"
}

# Operator zakresu - generuje ciąg liczb
1..10  # Wynik: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Operator \d w wyrażeniach regularnych oznacza "dowolna cyfra". Zamieniając go na "X", zamieniasz każdą cyfrę na X.

Operatory łańcuchowe i specjalne w PowerShell rozszerzają możliwości przetwarzania tekstu i danych poza standardowe porównania i przypisania. Operator `-match` wykorzystuje wyrażenia regularne do sprawdzania, czy tekst pasuje do zdefiniowanego wzorca, a przy okazji wypełnia automatyczną zmienną `$matches` wynikami dopasowania. Operator `-replace` umożliwia zamianę fragmentów tekstu według wzorca, co jest szczególnie przydatne przy czyszczeniu i normalizacji danych.

Operator zakresu `..` generuje sekwencje liczb całkowitych, na przykład `1..10` tworzy tablicę od 1 do 10, co jest przydatne w pętlach i przy generowaniu testowych danych. Operator `-in` sprawdza, czy element znajduje się w kolekcji, a `-contains` robi to samo, ale z perspektywy kolekcji. Znajomość tych operatorów znacząco przyspiesza pisanie kodu i pozwala na wyrażenie złożonych operacji w zwięzły sposób, bez konieczności pisania rozbudowanych pętli i warunków.

47Formatowanie wyjścia

Polecenia cmdlet formatujące

Służą do zmiany sposobu wyświetlania danych. Uwaga: Używaj ich ZAWSZE na końcu potoku!

  • Format-Table (ft) - wyświetla dane jako tabelę
  • Format-List (fl) - wyświetla każdą właściwość w osobnej linii
# Format-Table - wyświetl jako tabela
# Domyślny format dla list
Get-Process | Select-Object Name, Id, CPU | Format-Table

# Format-Table z dopasowaniem szerokości kolumn
# -AutoSize dopasowuje szerokość do danych
Get-Service | Where-Object Status -eq "Running" | Format-Table -AutoSize

# Format-List - wyświetl jako listę właściwości
# Przydatne, gdy obiekt ma wiele właściwości
Get-Process | Select-Object -First 1 | Format-List *

# Eksport do pliku CSV
Get-Process | Export-Csv -Path "C:\Temp\procesy.csv" -NoTypeInformation

# Eksport do pliku HTML (tabela HTML)
Get-Process | ConvertTo-Html | Out-File "C:\Temp\procesy.html"

Format-* NIEZBĘDNIE musi być na końcu potoku! Po ich użyciu obiekt jest zamieniany na tekst i nie można go dalej przetwarzać.

Formatowanie wyjścia w PowerShell pozwala na dostosowanie sposobu prezentacji danych w konsoli lub w pliku, co jest szczególnie ważne przy generowaniu raportów. Format-Table wyświetla dane w formie tabelarycznej, co jest czytelne dla danych numerycznych i zestawień, natomiast Format-List prezentuje każdą właściwość w osobnej linii, co sprawdza się przy obiektach z wieloma atrybutami. Należy pamiętać, że polecenia Format-* muszą być zawsze ostatnim elementem potoku, ponieważ konwertują obiekty na tekst i uniemożliwiają dalsze przetwarzanie.

Oprócz formatowania na ekranie, PowerShell oferuje także możliwość eksportu danych do plików CSV za pomocą Export-Csv oraz do HTML za pomocą ConvertTo-Html. Eksport do CSV jest szczególnie przydatny przy przenoszeniu danych między systemami i dalszej analizie w arkuszach kalkulacyjnych. Export do HTML pozwala na szybkie generowanie czytelnych raportów, które można otworzyć w przeglądarce internetowej i udostępnić zespołowi bez konieczności instalowania dodatkowego oprogramowania.

48Przykładowy skrypt 1: Lista plików

Skrypt: Generowanie listy plików

Ten skrypt przeszukuje katalog i tworzy raport z plikami spełniającymi kryteria.

# =============================================
# Skrypt: Generowanie raportu z plików
# =============================================

param(
    [string]$Sciezka = "C:\Windows\System32",    # Katalog do przeszukania
    [string]$Filtr = "*.dll",                     # Szukaj tylko plików .dll
    [int]$MinRozmiarKB = 100                     # Minimalny rozmiar w KB
)

Write-Host "Szukam plików: $Filtr"
Write-Host "W katalogu: $Sciezka"
Write-Host "Minimalny rozmiar: $MinRozmiarKB KB"

# Znajdź pliki spełniające kryteria
$pliki = Get-ChildItem -Path $Sciezka -Filter $Filtr -File -ErrorAction SilentlyContinue |
         Where-Object { $_.Length -gt ($MinRozmiarKB * 1024) } |  # Konwertuj KB na bajty
         Sort-Object Length -Descending

Write-Host "Znaleziono $($pliki.Count) plików"

# Wyświetl listę z rozmiarami
foreach ($plik in $pliki) {
    $rozmiarMB = [math]::Round($plik.Length / 1MB, 2)  # Zaokrąglij do 2 miejsc
    Write-Host "$($plik.Name) - $rozmiarMB MB"
}

Ten skrypt możesz uruchomić z własnymi parametrami: .\raport.ps1 -Sciezka "C:\MojePliki" -Filtr "*.txt" -MinRozmiarKB 50

Przykładowy skrypt do generowania listy plików pokazuje praktyczne zastosowanie kilku poznanych wcześniej koncepcji PowerShell. Skrypt wykorzystuje parametry wejściowe do określenia katalogu, filtru i minimalnego rozmiaru pliku, co czyni go elastycznym i wielokrotnego użytku. Get-ChildItem z odpowiednimi parametrami wyszukuje pliki, Where-Object filtruje je według rozmiaru, a Sort-Object porządkuje wyniki malejąco według wielkości pliku.

Wewnętrzna pętla foreach przetwarza znalezione pliki i wyświetla ich nazwy wraz z rozmiarami w megabajtach, zaokrąglonymi do dwóch miejsc po przecinku. Taki skrypt może być używany przez administratorów do szybkiego audytu dysków, identyfikacji największych plików lub znajdowania plików określonego typu. Możliwość uruchomienia z różnymi parametrami bez modyfikowania kodu źródłowego pokazuje siłę parametryzacji w PowerShell.

49Przykładowy skrypt 2: Monitoring usług

Skrypt: Monitorowanie usług Windows

Sprawdza status wybranych usług systemowych i raportuje problemy.

# =============================================
# Skrypt: Monitorowanie usług Windows
# =============================================

param(
    [string[]]$Uslugi = @("Spooler", "W32Time", "EventLog", "BITS")
)

Write-Host "Data sprawdzenia: $(Get-Date)"
Write-Host ""

$wszystkieOK = $true

# Sprawdź każdą usługę z listy
foreach ($nazwa in $Uslugi) {
    # Spróbuj pobrać usługę (jeśli nie istnieje, zignoruj błąd)
    $usluga = Get-Service -Name $nazwa -ErrorAction SilentlyContinue
    
    if ($usluga) {
        # Sprawdź status usługi
        if ($usluga.Status -eq "Running") {
            Write-Host "[OK] $($usluga.DisplayName)" -ForegroundColor Green
        } else {
            # Usługa nie działa!
            Write-Host "[PROBLEM] $($usluga.DisplayName) ($($usluga.Status))" -ForegroundColor Red
            $wszystkieOK = $false
        }
    } else {
        # Usługa nie istnieje w systemie
        Write-Host "[BRAK] Usługa '$nazwa' nie znaleziona" -ForegroundColor Yellow
    }
}

# Podsumowanie
if ($wszystkieOK) {
    Write-Host "Wszystkie usługi działają poprawnie!" -ForegroundColor Green
} else {
    Write-Host "UWAGA: Niektóre usługi wymagają uwagi!" -ForegroundColor Red
}

Skrypt monitoruje kluczowe usługi systemowe. Możesz go uruchamiać automatycznie (np. z Harmonogramu zadań Windows), aby sprawdzać stan usług.

Skrypt do monitorowania usług Windows jest praktycznym narzędziem, które może być używane przez administratorów do automatycznego sprawdzania stanu kluczowych usług systemowych. Skrypt przyjmuje listę nazw usług jako parametr i dla każdej z nich sprawdza, czy istnieje i czy jest uruchomiona. Wyniki są kolorowane: zielony dla działających usług, czerwony dla problematycznych i żółty dla nieznalezionych, co ułatwia szybką ocenę sytuacji.

Taki skrypt może być uruchamiany cyklicznie z Harmonogramu zadań Windows i wysyłać powiadomienia w przypadku wykrycia problemów. Użycie `-ErrorAction SilentlyContinue` przy Get-Service zapobiega przerywaniu skryptu w przypadku, gdy usługa o podanej nazwie nie istnieje w systemie. Po przejściu przez wszystkie usługi skrypt generuje podsumowanie informujące, czy wszystkie usługi działają poprawnie, co pozwala na szybką ocenę stanu systemu.

50Przykładowy skrypt 3: Prosta kopia zapasowa

Skrypt: Kopia zapasowa plików

Tworzy kopię zapasową wskazanych plików do folderu backup.

# =============================================
# Skrypt: Prosta kopia zapasowa
# =============================================

param(
    [Parameter(Mandatory=$true)]       # Parametr OBOWIĄZKOWY
    [string]$Zrodlo,
    [string]$Cel = "C:\Backup"       # Domyślna lokalizacja backupu
)

# Sprawdź, czy katalog źródłowy istnieje
if (-not (Test-Path $Zrodlo)) {
    Write-Host "BŁĄD: Katalog źródłowy nie istnieje!" -ForegroundColor Red
    exit 1  # Zakończ skrypt z kodem błędu 1
}

# Utwórz katalog docelowy, jeśli nie istnieje
if (-not (Test-Path $Cel)) {
    New-Item -Path $Cel -ItemType Directory | Out-Null
}

# Generuj unikalną nazwę folderu z datą i godziną
$data = Get-Date -Format "yyyy-MM-dd_HH-mm"
$celBackup = Join-Path $Cel "Backup_$data"
New-Item -Path $celBackup -ItemType Directory | Out-Null

# Kopiuj wszystkie pliki z źródła do backupu
Copy-Item -Path "$Zrodlo\*" -Destination $celBackup -Recurse

Write-Host "Kopia zapasowa utworzona!" -ForegroundColor Green
Write-Host "Lokalizacja: $celBackup"

Parametr [Parameter(Mandatory=$true)] oznacza, że użytkownik MUSI podać ten parametr. Bez niego skrypt się nie uruchomi i wyświetli błąd.

Skrypt do tworzenia kopii zapasowych to jeden z klasycznych przykładów automatyzacji w PowerShell, który pokazuje, jak w kilkunastu liniach kodu zrealizować wartościowe narzędzie administracyjne. Skrypt wymaga podania ścieżki źródłowej jako parametru obowiązkowego oraz opcjonalnie ścieżki docelowej z domyślną wartością. Przed wykonaniem kopii skrypt sprawdza, czy katalog źródłowy istnieje, co zapobiega błędom w trakcie działania.

Do nazwy folderu docelowego dodawana jest aktualna data i godzina w formacie RRRR-MM-DD_GG-MM, co zapewnia unikalność każdej kopii i umożliwia łatwe odtworzenie historii backupów. Kopiowanie plików odbywa się za pomocą Copy-Item z parametrem -Recurse, który przenosi całą strukturę katalogów. Atrybut `[Parameter(Mandatory=$true)]` wymusza podanie ścieżki źródłowej, co zabezpiecza przed przypadkowym uruchomieniem bez niezbędnych argumentów.

51Przykładowy skrypt 4: Czyszczenie plików tymczasowych

Skrypt: Czyszczenie plików tymczasowych

Usuwa stare pliki tymczasowe z wybranych lokalizacji.

# =============================================
# Skrypt: Czyszczenie plików tymczasowych
# =============================================

param(
    [int]$DniDoUsuniecia = 7,       # Usuwaj pliki starsze niż 7 dni
    [switch]$Symulacja                # Tryb symulacji - tylko pokazuj, nie usuwaj
)

Write-Host "Usuwam pliki starsze niż: $DniDoUsuniecia dni"
if ($Symulacja) {
    Write-Host "TRYB: SYMULACJA (nic nie będzie usunięte)" -ForegroundColor Yellow
}

# Lista lokalizacji do sprawdzenia
$lokalizacje = @($env:TEMP, "C:\Windows\Temp")
$calyLicznik = 0

# Przejdź przez każdą lokalizację
foreach ($lokalizacja in $lokalizacje) {
    if (Test-Path $lokalizacja) {
        # Znajdź stare pliki (LastWriteTime < dzisiaj - X dni)
        $starePliki = Get-ChildItem -Path $lokalizacja -Recurse -File -ErrorAction SilentlyContinue |
                      Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$DniDoUsuniecia) }
        
        foreach ($plik in $starePliki) {
            Write-Host "  - $($plik.Name)"
            if (-not $Symulacja) {
                # Faktycznie usuń plik (tylko jeśli NIE jest tryb symulacji)
                Remove-Item -Path $plik.FullName -Force -ErrorAction SilentlyContinue
            }
            $calyLicznik++
        }
    }
}

Write-Host "Znaleziono plików do usunięcia: $calyLicznik"

Przełącznik -Symulacja pozwala przetestować skrypt bezpiecznie - zobaczysz, co BYŁOBY usunięte, ale nic nie zostanie faktycznie skasowane.

Skrypt do czyszczenia plików tymczasowych pokazuje, jak bezpiecznie automatyzować potencjalnie niebezpieczne operacje usuwania danych. Kluczowym elementem jest przełącznik `-Symulacja`, który po włączeniu wyświetla listę plików przeznaczonych do usunięcia bez faktycznego ich kasowania, co pozwala na bezpieczne przetestowanie skryptu przed uruchomieniem go w trybie produkcyjnym. Parametr `$DniDoUsuniecia` określa wiek plików, które mają zostać usunięte.

Skrypt przeszukuje standardowe lokalizacje plików tymczasowych, takie jak folder TEMP użytkownika i systemowy katalog C:\Windows\Temp. Do wyszukiwania starych plików używane jest porównanie daty ostatniej modyfikacji z aktualną datą pomniejszoną o określoną liczbę dni. Tryb symulacji jest szczególnie przydatny przy wdrażaniu skryptu po raz pierwszy, ponieważ pozwala zweryfikować, które pliki zostaną usunięte, bez ryzyka utraty danych.

52Aliasy - skróty poleceń

Co to są aliasy?

Alias to skrócona nazwa dla polecenia. Pozwalają pisać szybciej.

Przydatne aliasy

  • ls = Get-ChildItem
  • cd = Set-Location
  • pwd = Get-Location
  • cp = Copy-Item
  • rm = Remove-Item
  • cat = Get-Content
  • % = ForEach-Object
  • ? = Where-Object
# Sprawdzenie, jakiemu poleceniu odpowiada alias
Get-Alias ls      # Pokaże: ls -> Get-ChildItem
Get-Alias cd      # Pokaże: cd -> Set-Location

# Tworzenie własnego aliasu
Set-Alias -Name gp -Value Get-Process
gp  # To samo, co Get-Process - ale krócej!

# Używanie w potoku
ls | ? { $_.Length -gt 1MB }   # ? = Where-Object
ls | % { $_.Name }              # % = ForEach-Object

Aliasy to skróty - w skryptach lepiej używaj pełnych nazw poleceń (dla czytelności), ale w interaktywnej pracy aliasy przyspieszają pisanie.

Aliasy w PowerShell to skrócone nazwy poleceń, które przyspieszają pracę w interaktywnej konsoli, choć w profesjonalnych skryptach zaleca się używanie pełnych nazw cmdletów dla zachowania czytelności. PowerShell zawiera wiele wbudowanych aliasów, takich jak `ls` dla Get-ChildItem, `cd` dla Set-Location czy `cat` dla Get-Content, które ułatwiają migrację użytkownikom przyzwyczajonym do CMD lub BASH. Aliasy można wyświetlić za pomocą polecenia Get-Alias, które pokazuje mapowanie między aliasem a pełną nazwą polecenia.

Tworzenie własnych aliasów za pomocą Set-Alias pozwala na dostosowanie środowiska pracy do indywidualnych preferencji. Należy jednak pamiętać, że aliasy zdefiniowane w sesji interaktywnej nie są dostępne po jej zamknięciu, chyba że zostaną dodane do profilu PowerShell. W skryptach współdzielonych z zespołem warto unikać niestandardowych aliasów, ponieważ mogą one nie być dostępne u innych użytkowników i prowadzić do błędów wykonania.

53Zmienne automatyczne - podsumowanie

Wbudowane zmienne PowerShell

PowerShell automatycznie tworzy wiele zmiennych, które dostarczają informacji o środowisku.

  • $_ - bieżący obiekt w potoku
  • $PSVersionTable - wersja PowerShell
  • $PWD - aktualny katalog (Present Working Directory)
  • $HOME - katalog domowy użytkownika
  • $null - wartość pusta (brak wartości)
  • $true / $false - wartości logiczne
  • $Error - tablica ostatnich błędów
# Wersja PowerShell
$PSVersionTable.PSVersion
# Wynik: np. 5.1.22621.1

# Aktualny katalog
$PWD
# Wynik: np. C:\Users\Student

# Katalog domowy użytkownika
$HOME
# Wynik: np. C:\Users\Student

# Ostatni błąd w sesji
$Error[0]
# Wynik: szczegóły ostatniego błędu

Zmienne automatyczne są zawsze dostępne - nie musisz ich tworzyć ani definiować. Po prostu używaj ich w swoim kodzie.

Zmienne automatyczne PowerShell to wbudowane zmienne, które są dostępne w każdej sesji bez konieczności ich definiowania i zawierają ważne informacje o środowisku wykonawczym. Zmienna `$PSVersionTable` przechowuje szczegółowe informacje o wersji PowerShell, w tym główny numer wersji, wersję kompilacji oraz wersję platformy .NET. `$PWD` wskazuje bieżący katalog roboczy, który zmienia się dynamicznie w trakcie nawigacji po systemie plików.

Zmienna `$HOME` zwraca ścieżkę do katalogu domowego bieżącego użytkownika, co jest przydatne przy odwoływaniu się do profilu lub dokumentów. `$Error` to tablica przechowująca wszystkie błędy, które wystąpiły w bieżącej sesji, z czego `$Error[0]` zawiera informacje o ostatnim błędzie. Znajomość zmiennych automatycznych pozwala na pisanie bardziej świadomych skryptów, które potrafią dostosować się do środowiska, w którym są uruchamiane.

54Zasady wykonywania skryptów

Co to jest Execution Policy?

Zasady bezpieczeństwa określające, czy i jakie skrypty PowerShell mogą być uruchamiane.

Dostępne zasady

  • Restricted - domyślna, nie pozwala na uruchamianie skryptów
  • RemoteSigned - skrypty lokalne dozwolone, pobrane muszą być podpisane
  • Unrestricted - wszystkie skrypty dozwolone
# Sprawdź aktualne zasady
Get-ExecutionPolicy
# Wynik: najprawdopodobniej Restricted

# Zmień zasady (wymaga uruchomienia jako Administrator!)
Set-ExecutionPolicy RemoteSigned

# Tymczasowo zmień zasady tylko dla bieżącej sesji:
# (działa tylko dopóki nie zamkniesz PowerShell)
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass

# Uruchomienie konkretnego skryptu bez zmiany zasad:
powershell.exe -ExecutionPolicy Bypass -File .\skrypt.ps1
Uwaga: Nigdy nie ustawiaj Unrestricted na stałe! To poważne zagrożenie bezpieczeństwa.

Zasady wykonywania skryptów (Execution Policy) w PowerShell to mechanizm bezpieczeństwa, który kontroluje możliwość uruchamiania skryptów na danym komputerze. Domyślna zasada Restricted uniemożliwia wykonanie jakichkolwiek skryptów, co ma na celu ochronę przed przypadkowym lub złośliwym kodem. Administrator może zmienić tę zasadę na RemoteSigned, która pozwala na uruchamianie lokalnych skryptów, ale wymaga podpisu cyfrowego dla skryptów pobranych z internetu.

Zmiana Execution Policy wymaga uruchomienia PowerShell jako administrator i wykonania `Set-ExecutionPolicy RemoteSigned`. Istnieje także możliwość tymczasowego pominięcia zasad dla konkretnego skryptu za pomocą flagi `-ExecutionPolicy Bypass` przy uruchamianiu PowerShell. Należy pamiętać, że Execution Policy nie jest barierą bezpieczeństwa nie do obejścia, a raczej mechanizmem zapobiegającym przypadkowemu uruchomieniu nieautoryzowanych skryptów. Dlatego ważne jest, aby pobierać skrypty tylko z zaufanych źródeł.

55Moduły PowerShell

Co to jest moduł?

Moduł to pakiet zawierający dodatkowe polecenia, funkcje i zasoby. Pozwala rozszerzyć możliwości PowerShell.

Przydatne moduły

  • ActiveDirectory - zarządzanie Active Directory
  • AzureAD - zarządzanie Azure Active Directory
  • SqlServer - zarządzanie SQL Server
# Sprawdź zainstalowane moduły
Get-Module -ListAvailable

# Załaduj moduł (aby używać jego poleceń)
Import-Module -Name NazwaModulu

# Zobacz, jakie polecenia udostępnia moduł
Get-Command -Module NazwaModulu

# Lista załadowanych modułów (aktualnie używanych)
Get-Module

# Odładuj moduł (gdy już nie potrzebujesz)
Remove-Module -Name NazwaModulu

Moduły to jak "dodatki" do PowerShell. Pozwalają na pracę z konkretnymi systemami (np. serwerami, chmurą) bez konieczności instalacji dodatkowego oprogramowania.

Moduły PowerShell to pakiety rozszerzające funkcjonalność powłoki o dodatkowe polecenia, funkcje i zasoby, które można importować w razie potrzeby. Domyślna instalacja PowerShell zawiera już wiele wbudowanych modułów, ale można także instalować moduły z PowerShell Gallery, która jest centralnym repozytorium społecznościowym. Moduły mogą dotyczyć różnych obszarów, od zarządzania Active Directory przez obsługę Azure po administrację SQL Server.

Instalacja modułu z PowerShell Gallery jest prosta i sprowadza się do polecenia `Install-Module -Name NazwaModulu`. Po zainstalowaniu modułu można go zaimportować za pomocą `Import-Module`, co udostępnia wszystkie jego polecenia w bieżącej sesji. Przeglądanie dostępnych poleceń w module umożliwia `Get-Command -Module NazwaModulu`. Moduły stanowią potężne narzędzie do rozszerzania możliwości PowerShell bez konieczności ręcznego pisania całego kodu od podstaw, co znacząco przyspiesza rozwój skryptów administracyjnych.

56Słownik podstawowych pojęć

Ważne terminy do zapamiętania

  • Cmdlet - podstawowe polecenie PowerShell (np. Get-Process)
  • Potok (Pipeline) - łączenie poleceń za pomocą |
  • Zmienna - pojemnik na dane (zaczyna się od $)
  • Obiekt - struktura danych z właściwościami i metodami
  • Tablica - kolekcja elementów z indeksowaniem numerycznym
  • Hash Table - kolekcja par klucz-wartość
  • Funkcja - nazwana grupa poleceń do wielokrotnego użycia
  • Alias - skrócona nazwa polecenia
  • Parametr - argument przekazywany do polecenia
  • Provider - mechanizm dostępu do różnych typów danych

Słownik podstawowych pojęć PowerShell zawiera definicje kluczowych terminów, które każdy użytkownik powinien znać, aby swobodnie poruszać się w świecie tej powłoki. Cmdlet to podstawowe polecenie PowerShell zbudowane według konwencji Czasownik-Rzeczownik, które wykonuje konkretną operację na systemie. Potok, oznaczany pionową kreską, służy do łączenia poleceń poprzez przekazywanie obiektów z jednego cmdleta do drugiego. Zmienna to nazwany pojemnik na dane identyfikowany znakiem dolara na początku nazwy.

Obiekt w PowerShell to struktura danych zawierająca właściwości i metody, która reprezentuje zasób systemowy, taki jak proces, plik czy usługa. Tablica przechowuje kolekcję elementów indeksowanych numerycznie, natomiast Hash Table to struktura klucz-wartość przypominająca słownik. Funkcja grupuje polecenia pod jedną nazwą dla wielokrotnego użycia, a alias stanowi skróconą alternatywę dla pełnej nazwy polecenia. Provider to mechanizm umożliwiający dostęp do różnych typów danych, takich jak system plików, rejestr czy certyfikaty, za pomocą spójnego interfejsu.

57Ściągawka: Najważniejsze polecenia

Polecenia systemowe

  • Get-Process - lista uruchomionych procesów
  • Get-Service - lista usług systemowych
  • Get-EventLog - logi zdarzeń systemowych
  • Get-ComputerInfo - informacje o komputerze

Polecenia plikowe

  • Get-ChildItem - zawartość katalogu
  • Get-Content - odczyt pliku tekstowego
  • Set-Content / Add-Content - zapis do pliku
  • Copy-Item / Move-Item / Remove-Item
  • Test-Path - sprawdzenie, czy ścieżka istnieje

Polecenia pomocnicze

  • Get-Help - dokumentacja poleceń
  • Get-Command - wyszukiwanie poleceń
  • Get-Member - właściwości obiektu
  • Where-Object - filtrowanie elementów
  • Select-Object - wybieranie właściwości
  • Sort-Object - sortowanie

Ściągawka najważniejszych poleceń PowerShell grupuje cmdlety według kategorii, co ułatwia szybkie znalezienie odpowiedniego narzędzia do konkretnego zadania. Polecenia systemowe, takie jak Get-Process, Get-Service i Get-ComputerInfo, pozwalają na monitorowanie stanu systemu i diagnozowanie problemów. Get-EventLog umożliwia przeglądanie logów zdarzeń, co jest niezbędne przy analizie błędów i audytach bezpieczeństwa.

Polecenia plikowe, w tym Get-ChildItem do przeglądania zawartości katalogów i Get-Content do odczytu plików tekstowych, stanowią podstawę pracy z systemem plików. Copy-Item, Move-Item i Remove-Item odpowiadają za operacje na plikach i katalogach. Polecenia pomocnicze, takie jak Get-Help, Get-Command, Get-Member, Where-Object, Select-Object i Sort-Object, wspierają codzienną pracę poprzez ułatwienie wyszukiwania, filtrowania i sortowania danych. Zapamiętanie tych kilkunastu poleceń pozwala na wykonanie większości zadań administracyjnych.

58Podsumowanie i dalsza nauka

Czego się nauczyłeś?

  • Podstawy PowerShell - czym jest i dlaczego warto się uczyć
  • Polecenia cmdlet i potok obiektowy
  • Zmienne, typy danych, tablice i tablice mieszające
  • Struktury kontrolne - warunki i pętle
  • Funkcje i obsługa błędów
  • Praca z plikami i katalogami
  • Pisanie własnych skryptów

Gdzie szukać więcej informacji?

  • Dokumentacja Microsoft: learn.microsoft.com/pl-pl/powershell/
  • Polecenie: Get-Help -Name * -Online (otwiera dokumentację online)
  • Microsoft Learn - darmowe kursy online
  • PowerShell Gallery - gotowe skrypty i moduły
Praktyka czyni mistrza! Najlepszym sposobem nauki PowerShell jest codzienne używanie go. Zaczynij od prostych poleceń, stopniowo przechodząc do skryptów.

Podsumowanie kursu wskazuje, jak wiele obszarów PowerShell udało się omówić podczas wspólnej nauki, od podstawowych pojęć po praktyczne skrypty automatyzujące. Uczestnik kursu poznał mechanizmy cmdletów i potoku obiektowego, które stanowią fundament wydajnej pracy z PowerShell. Zmienne, typy danych i struktury kolekcyjne, takie jak tablice i tablice mieszające, dostarczają narzędzi do efektywnego przechowywania i przetwarzania informacji. Instrukcje warunkowe i pętle umożliwiają budowanie złożonej logiki decyzyjnej i iteracyjnej.

Funkcje i obsługa błędów pozwalają na tworzenie profesjonalnych narzędzi gotowych do wdrożenia w środowisku produkcyjnym. Praktyczne skrypty zaprezentowane w kursie stanowią punkt wyjścia do własnych projektów automatyzacyjnych. Po ukończeniu kursu warto kontynuować naukę poprzez korzystanie z oficjalnej dokumentacji Microsoft, interaktywnych kursów na platformie Microsoft Learn oraz eksperymentowanie z własnymi skryptami. Systematyczna praktyka i stopniowe zwiększanie poziomu trudności to klucz do osiągnięcia biegłości w PowerShell.

59Co dalej z PowerShell?

Kierunki dalszego rozwoju

  • Active Directory - zarządzanie użytkownikami w firmie
  • Azure PowerShell - praca z chmurą Microsoft
  • VMware/Hyper-V - zarządzanie wirtualizacją
  • Windows Server - administracja serwerami
  • Automatyzacja DevOps - CI/CD pipelines

Praktyczne projekty do ćwiczeń

  • Automatyczne tworzenie kopii zapasowych
  • Monitoring serwerów i usług
  • Zarządzanie użytkownikami w Active Directory
  • Raportowanie z systemów IT
  • Automatyczna konfiguracja nowych stanowisk
PowerShell Gallery: społeczność oferuje tysiące gotowych modułów i skryptów do pobrania i użycia!

Kierunki dalszego rozwoju po ukończeniu kursu PowerShell otwierają przed administratorem wiele możliwości specjalizacji w różnych obszarach IT. Active Directory to jeden z najczęstszych kierunków, gdzie PowerShell pozwala na automatyzację zarządzania użytkownikami, grupami i uprawnieniami w środowiskach korporacyjnych. Azure PowerShell umożliwia zarządzanie zasobami w chmurze Microsoft, co jest niezbędne dla firm migrujących swoją infrastrukturę do chmury. Zarządzanie wirtualizacją za pomocą VMware lub Hyper-V to kolejny obszar, gdzie skrypty PowerShell znacząco przyspieszają codzienną pracę.

Praktyczne projekty do samodzielnego ćwiczenia obejmują automatyzację kopii zapasowych, monitoring serwerów, zarządzanie kontami użytkowników oraz raportowanie stanu infrastruktury IT. PowerShell Gallery oferuje tysiące gotowych modułów i skryptów, które można dostosować do własnych potrzeb. Dla osób zainteresowanych DevOps, PowerShell integruje się z narzędziami CI/CD, takimi jak Azure DevOps czy GitHub Actions, co pozwala na włączenie skryptów w procesy ciągłej integracji i wdrażania.

60Dziękuję za uwagę!

Kurs PowerShell dla początkujących

Gratulacje! Ukończyłeś podstawowy kurs PowerShell. Teraz masz wiedzę potrzebną do:

  • Nawigacji w systemie plików
  • Tworzenia własnych skryptów
  • Automatyzacji powtarzalnych zadań
  • Pracy z usługami i procesami Windows

Pamiętaj!

Pisanie skryptów to umiejętność, która wymaga praktyki. Im więcej ćwiczysz, tym lepsze efekty osiągniesz.

PowerShell to potężne narzędzie - powodzenia w dalszej nauce!

Gratulacje z okazji ukończenia kursu PowerShell są w pełni zasłużone, ponieważ opanowanie nawet podstaw tej potężnej powłoki wymaga zaangażowania i systematycznej pracy. Zdobyta wiedza pozwala na samodzielne tworzenie skryptów automatyzujących codzienne zadania administracyjne, zarządzanie plikami i usługami oraz analizę danych systemowych. PowerShell to narzędzie, które będzie Ci towarzyszyć przez całą karierę w IT, niezależnie od tego, czy zajmujesz się administracją systemami, programowaniem, czy inżynierią DevOps.

Pamiętaj, że umiejętność pisania skryptów rozwija się poprzez praktykę i rozwiązywanie realnych problemów. Nie bój się eksperymentować, testować nowych poleceń i analizować dokumentację. Społeczność PowerShell jest bardzo aktywna i pomocna, a na forach internetowych oraz w serwisie Stack Overflow znajdziesz odpowiedzi na większość pytań. Zachęcam Cię do dalszej nauki i tworzenia własnych projektów, które jeszcze bardziej pogłębią Twoje umiejętności. Powodzenia!