Do wykonania jedno, dowolne zadanie.

Pamiętaj, że aby uruchomić skrypt PS należy uruchomić konsole PowerShell i w niej wydać polecenie:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

1Wprowadzenie do PowerShell – Hello, PowerShell!

Cel zadania (~20 min)

Stwórz skrypt hello.ps1, który wita użytkownika, wyświetla aktualną datę i podstawowe informacje o środowisku PowerShell. Poznasz zmienne, polecenia Read-Host, Write-Host z kolorowaniem oraz wbudowane zmienne PowerShell.

Wymagania

  1. Poproś użytkownika o imię za pomocą Read-Host.
  2. Pobierz aktualną datę (Get-Date -Format) i wersję PowerShell ($PSVersionTable.PSVersion).
  3. Wyświetl kolorowy napis powitalny z użyciem -ForegroundColor i -BackgroundColor.
  4. Pokaż katalog domowy użytkownika z $env:USERPROFILE oraz nazwę komputera z $env:COMPUTERNAME.
  5. Użyj Get-CimInstance Win32_OperatingSystem do wyświetlenia pełnej nazwy systemu operacyjnego.

Wskazówki

Read-Host "tekst" wczytuje dane od użytkownika. Write-Host "tekst" -ForegroundColor Green wyświetla kolorowy tekst. $PSVersionTable zawiera wbudowane informacje o wersji. Zmienne środowiskowe są dostępne przez $env:NAZWA. Get-CimInstance pobiera dane z WMI – nie wymaga uprawnień administratora dla wielu klas.

Efekt działania

Skrypt wyświetla kolorowe powitanie z imieniem użytkownika, datą uruchomienia, wersją PowerShell, nazwą komputera i pełną nazwą systemu operacyjnego.

# Zadanie 1: Hello, PowerShell!
# Cel: Poznanie podstaw PowerShell

$imie = Read-Host "Podaj swoje imie"
$data = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$wersja = $PSVersionTable.PSVersion
$system = (Get-CimInstance Win32_OperatingSystem).Caption

Write-Host ""
Write-Host "========== Witaj w PowerShell! ==========" `
    -ForegroundColor Yellow -BackgroundColor DarkBlue
Write-Host "Uzytkownik:   $imie" -ForegroundColor Green
Write-Host "Data:         $data" -ForegroundColor Cyan
Write-Host "Wersja PS:    $wersja" -ForegroundColor Magenta
Write-Host "Komputer:     $env:COMPUTERNAME" -ForegroundColor Gray
Write-Host "Katalog:      $env:USERPROFILE" -ForegroundColor Gray
Write-Host "System:       $system" -ForegroundColor DarkYellow
Write-Host "=========================================" `
    -ForegroundColor Yellow -BackgroundColor DarkBlue
PRZYKLADOWY EKRAN WYNIKOWY:

PS C:\Users\Student> .\hello.ps1
Podaj swoje imie: Jan

========== Witaj w PowerShell! ==========
Uzytkownik:   Jan
Data:         2026-06-27 10:30:00
Wersja PS:    5.1.22621.2506
Komputer:     LAPTOP-STUDENT
Katalog:      C:\Users\Student
System:       Microsoft Windows 10 Pro
=========================================
2Kalkulator liczb – operacje arytmetyczne i walidacja

Cel zadania (~20 min)

Napisz skrypt kalkulator.ps1, który pobiera dwie liczby całkowite od użytkownika, wykonuje podstawowe operacje arytmetyczne i porównuje je. Nauczysz się walidacji danych wejściowych, rzutowania typów, operatorów porównania i formatowania napisów.

Wymagania

  1. Poproś o dwie liczby całkowite – użyj pętli do-until z walidacją -match '^-?\d+$'.
  2. Rzutuj wprowadzone teksty na typ [int].
  3. Oblicz i wyświetl: sumę, różnicę, iloczyn, iloraz (zmiennoprzecinkowy) i resztę z dzielenia.
  4. Obsłuż dzielenie przez zero komunikatem ostrzegawczym.
  5. Porównaj obie liczby operatorami -gt, -lt, -eq i wyświetl odpowiedni komunikat.
  6. Użyj operatora formatu -f do czytelnego wyświetlania wyników.

Wskazówki

$a -match '^-?\d+$' to wyrażenie regularne: opcjonalny minus na początku, potem cyfry. [int]$a rzutuje tekst na liczbę. W PowerShell dzielenie / automatycznie daje wynik zmiennoprzecinkowy. Operator % to reszta z dzielenia (modulo). "{0} + {1} = {2}" -f $x, $y, ($x+$y) formatuje napis z miejscem na wartości.

Efekt działania

Skrypt przyjmuje tylko poprawne liczby całkowite, wykonuje pięć operacji arytmetycznych, informuje o próbie dzielenia przez zero i pokazuje relację między liczbami.

# Zadanie 2: Kalkulator liczb calkowitych
# Cel: Operacje arytmetyczne, walidacja, porownania

do {
    $a = Read-Host "Podaj pierwsza liczbe calkowita"
} until ($a -match '^-?\d+$')

do {
    $b = Read-Host "Podaj druga liczbe calkowita"
} until ($b -match '^-?\d+$')

$x = [int]$a
$y = [int]$b

Write-Host "`n========== Wyniki obliczen ==========" `
    -ForegroundColor Yellow

Write-Host ("{0,-5} + {1,-5} = {2}" -f $x, $y, ($x + $y))
Write-Host ("{0,-5} - {1,-5} = {2}" -f $x, $y, ($x - $y))
Write-Host ("{0,-5} * {1,-5} = {2}" -f $x, $y, ($x * $y))

if ($y -eq 0) {
    Write-Host ("{0} / {1} = [NIE MOZNA DZIELIC PRZEZ ZERO]" -f $x, $y) `
        -ForegroundColor Red
    Write-Host ("{0} % {1} = [NIE MOZNA DZIELIC PRZEZ ZERO]" -f $x, $y) `
        -ForegroundColor Red
} else {
    Write-Host ("{0,-5} / {1,-5} = {2:N2}" -f $x, $y, ($x / $y))
    Write-Host ("{0,-5} % {1,-5} = {2}" -f $x, $y, ($x % $y))
}

Write-Host "=====================================" `
    -ForegroundColor Yellow

if ($x -gt $y) {
    Write-Host "$x jest wieksze niz $y" -ForegroundColor Green
} elseif ($x -lt $y) {
    Write-Host "$x jest mniejsze niz $y" -ForegroundColor Cyan
} else {
    Write-Host "Obie liczby sa rowne" -ForegroundColor Magenta
}
PRZYKLADOWY EKRAN WYNIKOWY:

PS C:\Users\Student> .\kalkulator.ps1
Podaj pierwsza liczbe calkowita: 20
Podaj druga liczbe calkowita: 7

========== Wyniki obliczen ==========
20    + 7     = 27
20    - 7     = 13
20    * 7     = 140
20    / 7     = 2.86
20    % 7     = 6
=====================================
20 jest wieksze niz 7
3Eksplorator plików – analiza zawartości katalogu

Cel zadania (~20 min)

Stwórz skrypt eksplorator.ps1, który analizuje wskazany katalog i wyświetla szczegółowe statystyki: liczbę plików i podkatalogów, największe pliki, średni rozmiar, najstarsze i najnowsze pliki. Poznasz polecenia Get-ChildItem, Test-Path, Where-Object, Sort-Object i Measure-Object.

Wymagania

  1. Poproś o ścieżkę katalogu; jeśli pusty – użyj bieżącego (Get-Location).
  2. Sprawdź czy katalog istnieje (Test-Path -PathType Container) – jeśli nie, wyświetl błąd i zakończ.
  3. Policz pliki (Where-Object { -not $_.PSIsContainer }) i podkatalogi.
  4. Znajdź 5 największych plików posortowanych według rozmiaru malejąco.
  5. Oblicz średni, minimalny i maksymalny rozmiar pliku (Measure-Object Length -Average -Minimum -Maximum).
  6. Znajdź najstarszy i najnowszy plik według daty modyfikacji.

Wskazówki

Get-ChildItem -Path $path pobiera zawartość katalogu. $_.PSIsContainer jest $true dla katalogów. Sort-Object Length -Descending | Select-Object -First 5 znajduje 5 największych plików. Measure-Object -Property Length -Average -Maximum -Minimum daje statystyki. W PowerShell 3+ można użyć -File i -Directory zamiast PSIsContainer.

Efekt działania

Skrypt wyświetla pełny raport z analizy katalogu: liczbę plików i katalogów, tabelę 5 największych plików, średni/max/min rozmiar oraz najstarszy i najnowszy plik.

# Zadanie 3: Eksplorator plikow
# Cel: Analiza katalogu, statystyki plikow

$sciezka = Read-Host "Podaj sciezke katalogu"
if ([string]::IsNullOrWhiteSpace($sciezka)) {
    $sciezka = Get-Location
}

if (-not (Test-Path -Path $sciezka -PathType Container)) {
    Write-Host "BLAD: Katalog '$sciezka' nie istnieje!" -ForegroundColor Red
    exit 1
}

$elementy = Get-ChildItem -Path $sciezka
$pliki = $elementy | Where-Object { -not $_.PSIsContainer }
$foldery = $elementy | Where-Object { $_.PSIsContainer }

Write-Host "`n========== RAPORT Z ANALIZY ==========" `
    -ForegroundColor Yellow
Write-Host "Sciezka:       $sciezka"
Write-Host "Liczba plikow: $($pliki.Count)"
Write-Host "Liczba kat.:   $($foldery.Count)"

if ($pliki.Count -gt 0) {
    Write-Host "`n--- 5 najwiekszych plikow ---" `
        -ForegroundColor Cyan
    $pliki | Sort-Object Length -Descending |
        Select-Object -First 5 |
        Format-Table Name,
            @{N="Rozmiar (KB)";E={[math]::Round($_.Length/1KB, 1)}},
            LastWriteTime -AutoSize

    $stat = $pliki | Measure-Object Length `
        -Average -Maximum -Minimum

    Write-Host "`n--- Statystyki rozmiarow ---" `
        -ForegroundColor Cyan
    Write-Host ("Sredni:  {0:N0} B" -f $stat.Average)
    Write-Host ("Maksym.: {0:N0} B" -f $stat.Maximum)
    Write-Host ("Minimal.:{0:N0} B" -f $stat.Minimum)

    $najstarszy = $pliki | Sort-Object LastWriteTime |
        Select-Object -First 1
    $najnowszy = $pliki | Sort-Object LastWriteTime -Descending |
        Select-Object -First 1

    Write-Host "`n--- Najstarszy plik ---" -ForegroundColor Cyan
    Write-Host "$($najstarszy.Name) ($($najstarszy.LastWriteTime))"
    Write-Host "--- Najnowszy plik ---" -ForegroundColor Cyan
    Write-Host "$($najnowszy.Name) ($($najnowszy.LastWriteTime))"
}
Write-Host "=======================================" `
    -ForegroundColor Yellow
PRZYKLADOWY EKRAN WYNIKOWY:

PS C:\Users\Student> .\eksplorator.ps1
Podaj sciezke katalogu: C:\Users\Student\Dokumenty

========== RAPORT Z ANALIZY ==========
Sciezka:       C:\Users\Student\Dokumenty
Liczba plikow: 47
Liczba kat.:   5

--- 5 najwiekszych plikow ---
Name                    Rozmiar (KB) LastWriteTime
----                    ------------ -------------
raport.pdf                  2456,7   2026-06-20 14:30:00
prezentacja.pptx            1890,2   2026-06-18 09:15:00
dane.csv                      320,5   2026-06-25 16:45:00
skrypt.ps1                     12,8   2026-06-27 10:00:00
notatki.txt                     4,2   2026-06-22 11:20:00

--- Statystyki rozmiarow ---
Sredni:   104432 B
Maksym.:  2515968 B
Minimal.: 128 B

--- Najstarszy plik ---
prezentacja.pptx (18.06.2026 09:15:00)
--- Najnowszy plik ---
skrypt.ps1 (27.06.2026 10:00:00)
=======================================
4Analiza procesów – menedżer zadań w PowerShell

Cel zadania (~20 min)

Napisz skrypt procesy.ps1, który pobiera listę procesów systemowych, sortuje je według użycia CPU i pamięci RAM, filtruje według nazwy, oblicza statystyki i umożliwia zakończenie wybranego procesu. Poznasz Get-Process, Stop-Process i zaawansowane potoki.

Wymagania

  1. Wyświetl 10 procesów zużywających najwięcej CPU (Sort-Object CPU -Descending).
  2. Wyświetl 10 procesów zużywających najwięcej pamięci RAM (WorkingSet64).
  3. Zapytaj o filtr nazwy i wyświetl pasujące procesy w tabeli.
  4. Oblicz całkowite użycie RAM: sumę WorkingSet64 dla wszystkich procesów.
  5. Zapytaj o PID procesu do zakończenia i użyj Stop-Process z obsługą błędów (try-catch).
  6. Policz liczbę procesów według nazwy (Group-Object ProcessName).

Wskazówki

Get-Process zwraca wszystkie uruchomione procesy. Where-Object { $_.ProcessName -like "*$filter*" } filtruje według nazwy. Group-Object ProcessName | Sort-Object Count -Descending grupuje i sortuje. Konwersja bajtów na MB: $_.WorkingSet64 / 1MB. Stop-Process -Id $pid kończy proces; użyj -ErrorAction Stop i try-catch.

Efekt działania

Skrypt wyświetla listy procesów (CPU i RAM), umożliwia filtrowanie, pokazuje statystyki grupowania i całkowite użycie pamięci, a także kończy wybrany proces z komunikatem o wyniku.

# Zadanie 4: Analiza procesow
# Cel: Zarzadzanie procesami, sortowanie, filtrowanie

Write-Host "========== MENEDZER PROCESOW ==========" `
    -ForegroundColor Yellow

Write-Host "`n--- TOP 10 (CPU) ---" -ForegroundColor Cyan
Get-Process | Sort-Object CPU -Descending |
    Select-Object -First 10 |
    Format-Table Name, Id,
        @{N="CPU (s)";E={[math]::Round($_.CPU, 1)}},
        @{N="RAM (MB)";E={[math]::Round($_.WorkingSet64/1MB, 1)}} -AutoSize

Write-Host "--- TOP 10 (RAM) ---" -ForegroundColor Cyan
Get-Process | Sort-Object WorkingSet64 -Descending |
    Select-Object -First 10 |
    Format-Table Name, Id,
        @{N="RAM (MB)";E={[math]::Round($_.WorkingSet64/1MB, 1)}} -AutoSize

$totalRAM = (Get-Process | Measure-Object WorkingSet64 -Sum).Sum
Write-Host "Calkowite uzycie RAM: " -NoNewline
Write-Host ("{0:N2} MB" -f ($totalRAM / 1MB)) -ForegroundColor Green

Write-Host "`n--- Grupowanie wg nazwy ---" -ForegroundColor Cyan
Get-Process | Group-Object ProcessName |
    Sort-Object Count -Descending | Select-Object -First 10 |
    Format-Table Count, Name -AutoSize

$filtr = Read-Host "`nFiltruj procesy (nazwa, ENTER = pomijn)"
if (-not [string]::IsNullOrWhiteSpace($filtr)) {
    Get-Process | Where-Object {
        $_.ProcessName -like "*$filtr*"
    } | Format-Table Name, Id, @{N="RAM(MB)";E={
        [math]::Round($_.WorkingSet64/1MB, 1)
    }} -AutoSize
}

$pid = Read-Host "Podaj PID do zakonczenia (ENTER = pomijn)"
if (-not [string]::IsNullOrWhiteSpace($pid)) {
    try {
        Stop-Process -Id $pid -ErrorAction Stop
        Write-Host "OK: Proces $pid zakonczony." -ForegroundColor Green
    } catch {
        Write-Host "BLAD: Nie mozna zakonczyc procesu $pid" `
            -ForegroundColor Red
    }
}
PRZYKLADOWY EKRAN WYNIKOWY:

PS C:\Users\Student> .\procesy.ps1
========== MENEDZER PROCESOW ==========

--- TOP 10 (CPU) ---
Name            Id CPU (s) RAM (MB)
----            -- ------- --------
chrome        4567  245,3    320,5
System         4    120,1     45,2
Code         7890   89,5    210,8
...

--- TOP 10 (RAM) ---
Name            Id RAM (MB)
----            -- --------
chrome        4567    320,5
Code         7890    210,8
explorer     1234    180,2
...

Calkowite uzycie RAM: 6542,30 MB

--- Grupowanie wg nazwy ---
Count Name
----- ----
   12 svchost
    8 chrome
    3 Code
...

Filtruj procesy (nazwa, ENTER = pomijn): chrome
Name    Id RAM(MB)
----    -- -------
chrome 4567   320,5
chrome 7891   180,2
...

Podaj PID do zakonczenia (ENTER = pomijn): 7891
OK: Proces 7891 zakonczony.
5Generator haseł – pętle i znaki losowe

Cel zadania (~20 min)

Stwórz skrypt haslo.ps1, który generuje bezpieczne, losowe hasła o zadanej długości. Nauczysz się pętli for, klasy [Random], operacji na znakach ([char]) oraz walidacji zakresu liczb.

Wymagania

  1. Poproś o długość hasła (domyślnie 12, zakres 8-64).
  2. Poproś o wybór zestawów znaków: małe litery, duże litery, cyfry, znaki specjalne.
  3. Wygeneruj hasło o zadanej długości z losowych znaków z wybranych zestawów.
  4. Użyj [char] do generowania znaków z kodów ASCII lub predefiniowanego stringa.
  5. Wygeneruj 5 losowych haseł i wyświetl je w tabeli z oceną siły (długość + różnorodność).
  6. Sprawdź czy hasło zawiera co najmniej jeden znak z każdego wybranego zestawu.

Wskazówki

[char]65 to znak A. Get-Random -Minimum 33 -Maximum 127 losuje liczbę z zakresu ASCII. $hasla = @(); for(...){ $hasla += $haslo } zbiera hasła w tablicy. Do oceny siły hasła użyj długości i testów -match '[A-Z]'. [string]::Join(", ", $tablica) łączy elementy.

Efekt działania

Skrypt generuje 5 losowych haseł według wybranych kryteriów, wyświetla je w tabeli z oceną siły i pokazuje, czy każde hasło spełnia wszystkie wymagania.

# Zadanie 5: Generator hasel
# Cel: Petle, znaki losowe, walidacja

$dlugosc = Read-Host "Dlugosc hasla (8-64) [ENTER = 12]"
if ([string]::IsNullOrWhiteSpace($dlugosc)) { $dlugosc = 12 }
$dlugosc = [int]$dlugosc
if ($dlugosc -lt 8 -or $dlugosc -gt 64) {
    Write-Host "BLAD: Dlugosc musi byc 8-64" -ForegroundColor Red
    exit 1
}

Write-Host "Zestawy znakow (t/n):"
$male = Read-Host "  Male litery (a-z)"
$duze = Read-Host "  Duze litery (A-Z)"
$cyfry = Read-Host "  Cyfry (0-9)"
$spec = Read-Host "  Specjalne (!@#...)"

$zestaw = ""
if ($male -eq "t") { $zestaw += "abcdefghijklmnopqrstuvwxyz" }
if ($duze -eq "t") { $zestaw += "ABCDEFGHIJKLMNOPQRSTUVWXYZ" }
if ($cyfry -eq "t") { $zestaw += "0123456789" }
if ($spec -eq "t") { $zestaw += "!@#$%^&*()_-+=<>?" }

if ($zestaw.Length -eq 0) {
    Write-Host "BLAD: Wybierz co najmniej jeden zestaw!" `
        -ForegroundColor Red
    exit 1
}

Write-Host "`n========== WYGLENEROWANE HASLA ==========" `
    -ForegroundColor Yellow

$wyniki = @()
for ($nr = 1; $nr -le 5; $nr++) {
    $haslo = ""
    for ($i = 0; $i -lt $dlugosc; $i++) {
        $haslo += $zestaw[(Get-Random -Minimum 0 `
            -Maximum $zestaw.Length)]
    }

    $sila = 0
    if ($haslo -match '[a-z]') { $sila++ }
    if ($haslo -match '[A-Z]') { $sila++ }
    if ($haslo -match '[0-9]') { $sila++ }
    if ($haslo -match '[^a-zA-Z0-9]') { $sila++ }

    $ocena = switch ($sila) {
        4 { "BARDZO SILNE" }
        3 { "SILNE" }
        default { "SLABE" }
    }

    $wyniki += [PSCustomObject]@{
        Nr = $nr
        Haslo = $haslo
        Dlugosc = $haslo.Length
        Sila = $sila
        Ocena = $ocena
    }
}

$wyniki | Format-Table -AutoSize
Write-Host "==========================================" `
    -ForegroundColor Yellow
PRZYKLADOWY EKRAN WYNIKOWY:

PS C:\Users\Student> .\haslo.ps1
Dlugosc hasla (8-64) [ENTER = 12]: 16
Zestawy znakow (t/n):
  Male litery (a-z): t
  Duze litery (A-Z): t
  Cyfry (0-9): t
  Specjalne (!@#...): t

========== WYGLENEROWANE HASLA ==========
Nr Haslo             Dlugosc Sila Ocena
-- -----             ------- ---- -----
 1 aB3$xK9!mP2#rT5v      16     4 BARDZO SILNE
 2 Qw7&zR1@yF4*cH8j      16     4 BARDZO SILNE
 3 Lp9?uX2%nV6_bG3k      16     4 BARDZO SILNE
 4 Zr5!tA8(hE1)wS4d      16     4 BARDZO SILNE
 5 Cm2^oN6+jK9
6Menu interaktywne – pętla do-while i instrukcja switch

Cel zadania (~20 min)

Stwórz skrypt menu.ps1, który wyświetla interaktywne menu z kilkoma opcjami: wyświetlenie daty, lista plików, info o systemie, kalkulator. Program działa w pętli aż do wybrania opcji wyjścia. Poznasz do-while, switch, Clear-Host i tworzenie funkcji.

Wymagania

  1. Zdefiniuj funkcję Show-Menu wyświetlającą opcje: 1–Data, 2–Pliki, 3–System, 4–Kalkulator, 5–Koniec.
  2. Użyj pętli do-while z warunkiem przy wyjściu (until ($choice -eq 5)).
  3. Użyj switch ($choice) do obsługi każdej opcji.
  4. Opcja 2: wyświetl pliki w bieżącym katalogu z Get-ChildItem.
  5. Opcja 3: pobierz informacje o systemie (Get-CimInstance Win32_OperatingSystem).
  6. Opcja 4: prosty kalkulator dodawania dwóch liczb.
  7. Po każdej opcji (oprócz wyjścia) wstrzymaj wykonanie Read-Host "Nacisnij Enter..." i wyczyść ekran.

Wskazówki

Clear-Host czyści ekran konsoli (odpowiednik cls w cmd). switch w PowerShell działa jak w innych językach — porównuje wartość z listą wzorców. Funkcje definiuje się jako function Nazwa { ... }. $null = Read-Host pomija zwracaną wartość.

Efekt działania

Skrypt działa jak aplikacja konsolowa z czytelnym menu. Użytkownik wybiera opcje, wykonują się odpowiednie akcje, ekran jest czyszczony przed ponownym wyświetleniem menu.

# Zadanie 6: Menu interaktywne
# Cel: Petla do-while, switch, funkcje

function Show-Menu {
    Clear-Host
    Write-Host "=============== MENU GLOWNE ===============" `
        -ForegroundColor Yellow
    Write-Host " 1. Wyswietl date i godzine"
    Write-Host " 2. Lista plikow w biezacym katalogu"
    Write-Host " 3. Informacje o systemie"
    Write-Host " 4. Kalkulator (dodawanie)"
    Write-Host " 5. Zakoncz"
    Write-Host "==========================================" `
        -ForegroundColor Yellow
}

do {
    Show-Menu
    $wybor = Read-Host "Wybierz opcje (1-5)"

    switch ($wybor) {
        "1" {
            Write-Host "`nAktualna data i godzina:" `
                -ForegroundColor Cyan
            Get-Date -Format "yyyy-MM-dd HH:mm:ss"
        }
        "2" {
            Write-Host "`nZawartosc biezacego katalogu:" `
                -ForegroundColor Cyan
            Get-ChildItem | Format-Table Name, Length,
                @{N="Typ";E={
                    if ($_.PSIsContainer) { "KATALOG" }
                    else { "PLIK" }
                }}, LastWriteTime -AutoSize
        }
        "3" {
            $os = Get-CimInstance Win32_OperatingSystem
            Write-Host "`nInformacje o systemie:" `
                -ForegroundColor Cyan
            Write-Host "System: $($os.Caption)"
            Write-Host "Wersja: $($os.Version)"
            Write-Host "Arch:   $($os.OSArchitecture)"
            Write-Host "Ostatni restart: $($os.LastBootUpTime)"
        }
        "4" {
            Write-Host "`nKalkulator - dodawanie" `
                -ForegroundColor Cyan
            $a = Read-Host "Podaj pierwsza liczbe"
            $b = Read-Host "Podaj druga liczbe"
            if ($a -match '^\d+$' -and $b -match '^\d+$') {
                Write-Host "$a + $b = $([int]$a + [int]$b)" `
                    -ForegroundColor Green
            } else {
                Write-Host "BLAD: Podaj poprawne liczby!" `
                    -ForegroundColor Red
            }
        }
        "5" {
            Write-Host "`nDo widzenia!" -ForegroundColor Yellow
        }
        default {
            Write-Host "`nNieprawidlowy wybor!" `
                -ForegroundColor Red
        }
    }

    if ($wybor -ne "5") {
        Write-Host "`nNacisnij Enter, aby kontynuowac..." `
            -NoNewline
        $null = Read-Host
    }
} until ($wybor -eq "5")
PRZYKLADOWY EKRAN WYNIKOWY:

=============== MENU GLOWNE ===============
 1. Wyswietl date i godzine
 2. Lista plikow w biezacym katalogu
 3. Informacje o systemie
 4. Kalkulator (dodawanie)
 5. Zakoncz
==========================================
Wybierz opcje (1-5): 1

Aktualna data i godzina:
2026-06-27 10:35:00

Nacisnij Enter, aby kontynuowac...

[po nacisnieciu Enter ekran jest czyszczony]
=============== MENU GLOWNE ===============
...
Wybierz opcje (1-5): 5

Do widzenia!
7Wyszukiwarka tekstu w plikach – Select-String

Cel zadania (~20 min)

Napisz skrypt szukaj.ps1, który rekurencyjnie przeszukuje pliki w katalogu pod kątem zadanego tekstu, grupuje wyniki według pliku i zapisuje raport. Poznasz Select-String, Get-ChildItem -Recurse, Group-Object i Out-File.

Wymagania

  1. Poproś o tekst do wyszukania, katalog (domyślnie bieżący) i maskę plików (domyślnie *.*).
  2. Użyj Get-ChildItem -Recurse -Include $mask do znalezienia plików.
  3. Dla każdego pliku użyj Select-String -Pattern $pattern -SimpleMatch -CaseSensitive:$false.
  4. Pogrupuj wyniki według nazwy pliku (Group-Object Filename).
  5. Wyświetl tabelę: plik, liczba trafień, linie z trafieniami.
  6. Zapisz pełny raport do pliku wyniki.txt i wyświetl podsumowanie (liczba plików, suma trafień).

Wskazówki

Select-String -SimpleMatch szuka dosłownego tekstu (bez regex). -CaseSensitive:$false ignoruje wielkość liter. Group-Object Filename grupuje wyniki według nazwy pliku. ForEach-Object { $_.Group | ... } przetwarza każdą grupę. Wyniki domyślnie mają właściwości: Filename, LineNumber, Line, Path.

Efekt działania

Skrypt znajduje wszystkie pliki zawierające szukany tekst, wyświetla pogrupowany raport z liczbą trafień, zapisuje do pliku i pokazuje podsumowanie.

# Zadanie 7: Wyszukiwarka tekstu
# Cel: Select-String, grupowanie, raport

$tekst = Read-Host "Podaj szukany tekst"
if ([string]::IsNullOrWhiteSpace($tekst)) {
    Write-Host "BLAD: Nie podano tekstu!" -ForegroundColor Red
    exit 1
}

$katalog = Read-Host "Podaj katalog (ENTER = biezacy)"
if ([string]::IsNullOrWhiteSpace($katalog)) {
    $katalog = Get-Location
}

$masks = Read-Host "Maska plikow (ENTER = *.*)"
if ([string]::IsNullOrWhiteSpace($masks)) { $masks = "*.*" }

if (-not (Test-Path -Path $katalog -PathType Container)) {
    Write-Host "BLAD: Katalog '$katalog' nie istnieje!" `
        -ForegroundColor Red
    exit 1
}

$pliki = Get-ChildItem -Path $katalog -Recurse `
    -Include $masks -File

if ($pliki.Count -eq 0) {
    Write-Host "Brak plikow pasujacych do maski." `
        -ForegroundColor Yellow
    exit 0
}

$wszystkieWyniki = @()
foreach ($plik in $pliki) {
    $trafienia = Select-String -Path $plik.FullName `
        -Pattern $tekst -SimpleMatch `
        -CaseSensitive:$false
    if ($trafienia) {
        $wszystkieWyniki += $trafienia
    }
}

if ($wszystkieWyniki.Count -eq 0) {
    Write-Host "Nie znaleziono tekstu '$tekst'." `
        -ForegroundColor Yellow
    exit 0
}

$grupy = $wszystkieWyniki | Group-Object Filename

Write-Host "`n========== WYNIKI WYSZUKIWANIA ==========" `
    -ForegroundColor Yellow
Write-Host "Szukano: '$tekst' w $katalog ($masks)"
Write-Host "Liczba plikow z trafieniami: $($grupy.Count)" `
    -ForegroundColor Cyan
Write-Host "Laczna liczba trafien: $($wszystkieWyniki.Count)" `
    -ForegroundColor Cyan

Write-Host "`n--- Szczegoly ---" -ForegroundColor Cyan
$raport = @()
foreach ($grupa in $grupy) {
    $raport += [PSCustomObject]@{
        Plik = $grupa.Name
        Trafienia = $grupa.Count
        Linie = ($grupa.Group | ForEach-Object {
            "  L$($_.LineNumber): $($_.Line.Trim())"
        }) -join "`n"
    }
}
$raport | Format-Table Plik, Trafienia -AutoSize

$raport | Out-File -FilePath "wyniki.txt" -Encoding UTF8
Write-Host "`nSzczegolowy raport zapisano: wyniki.txt" `
    -ForegroundColor Green
Write-Host "==========================================" `
    -ForegroundColor Yellow
PRZYKLADOWY EKRAN WYNIKOWY:

PS C:\Users\Student\Projekt> .\szukaj.ps1
Podaj szukany tekst: blad
Podaj katalog (ENTER = biezacy):
Maska plikow (ENTER = *.*): *.ps1

========== WYNIKI WYSZUKIWANIA ==========
Szukano: 'blad' w C:\Users\Student\Projekt (*.ps1)
Liczba plikow z trafieniami: 3
Laczna liczba trafien: 7

--- Szczegoly ---
Plik                          Trafienia
----                          ---------
skrypt.ps1                           3
test.ps1                             2
funkcje.ps1                          2

Szczegolowy raport zapisano: wyniki.txt
==========================================
8System backupu – archiwizacja i logowanie

Cel zadania (~20 min)

Stwórz skrypt backup.ps1, który wykonuje kopię zapasową wskazanego katalogu – kopiuje pliki, pakuje do archiwum ZIP, loguje operacje i weryfikuje wynik. Poznasz Copy-Item, Compress-Archive, Add-Content i operacje na datach.

Wymagania

  1. Poproś o katalog źródłowy i docelowy (domyślnie Backup_YYYYMMDD_HHmmss w bieżącym katalogu).
  2. Sprawdź czy katalog źródłowy istnieje – jeśli nie, zakończ z błędem.
  3. Utwórz katalog tymczasowy i skopiuj do niego wszystkie pliki (Copy-Item -Recurse).
  4. Zapakuj katalog tymczasowy do archiwum ZIP (Compress-Archive).
  5. Zapisz log operacji do pliku backup_log.txt (data, źródło, rozmiar, status).
  6. Usuń katalog tymczasowy, wyświetl podsumowanie: nazwa archiwum, rozmiar w MB, liczba plików.
  7. Sprawdź czy archiwum istnieje po zakończeniu i zweryfikuj jego rozmiar.

Wskazówki

Get-Date -Format "yyyyMMdd_HHmmss" tworzy znacznik czasu. Copy-Item $src\* $dst -Recurse -Force kopiuje zawartość. Compress-Archive -Path $tmp -DestinationPath $zip -Force tworzy archiwum. Add-Content -Path $log -Value $msg dopisuje do pliku logu. Get-ChildItem $src -Recurse -File | Measure-Object | % Count liczy pliki.

Efekt działania

Skrypt tworzy kopię zapasową w archiwum ZIP z nazwą zawierającą datę i godzinę, loguje operacje do pliku i wyświetla podsumowanie. Student poznaje typowy proces backupu w Windows.

# Zadanie 8: System backupu
# Cel: Archiwizacja, logowanie, walidacja

$zrodlo = Read-Host "Podaj katalog do backupu"
if (-not (Test-Path -Path $zrodlo -PathType Container)) {
    Write-Host "BLAD: Katalog '$zrodlo' nie istnieje!" `
        -ForegroundColor Red
    exit 1
}

$data = Get-Date -Format "yyyyMMdd_HHmmss"
$tmp = "TempBackup_$data"
$zip = "Backup_$data.zip"
$log = "backup_log.txt"
$licznikPlikow = 0

Write-Host "`n========== ROZPOCZECIE BACKUPU ==========" `
    -ForegroundColor Yellow

Write-Host "[1] Kopiowanie plikow..." -NoNewline
New-Item -ItemType Directory -Path $tmp | Out-Null
Copy-Item -Path "$zrodlo\*" -Destination $tmp `
    -Recurse -Force -ErrorAction Stop
$licznikPlikow = (Get-ChildItem -Path $tmp -Recurse -File).Count
Write-Host " OK ($licznikPlikow plikow)" -ForegroundColor Green

Write-Host "[2] Tworzenie archiwum ZIP..." -NoNewline
Compress-Archive -Path $tmp -DestinationPath $zip -Force
Write-Host " OK" -ForegroundColor Green

$rozmiar = (Get-Item $zip).Length
$komunikat = "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] " +
    "Backup: $zrodlo -> $zip | " +
    "Plikow: $licznikPlikow | " +
    "Rozmiar: $([math]::Round($rozmiar/1MB, 2)) MB | " +
    "Status: OK"
Add-Content -Path $log -Value $komunikat

Remove-Item -Path $tmp -Recurse -Force

Write-Host "[3] Czyszczenie... OK" -ForegroundColor Green

Write-Host "`n========== BACKUP ZAKONCZONY ==========" `
    -ForegroundColor Yellow
Write-Host "Archiwum:  $zip" -ForegroundColor Green
Write-Host "Rozmiar:   $([math]::Round($rozmiar/1KB, 1)) KB " +
    "($([math]::Round($rozmiar/1MB, 2)) MB)" -ForegroundColor Cyan
Write-Host "Plikow:    $licznikPlikow"
Write-Host "Zalogowano: $log" -ForegroundColor Gray

if (Test-Path $zip) {
    Write-Host "Weryfikacja: ARCHIWUM ISTNIEJE" `
        -ForegroundColor Green
} else {
    Write-Host "Weryfikacja: BLAD - brak archiwum!" `
        -ForegroundColor Red
}
Write-Host "========================================" `
    -ForegroundColor Yellow
PRZYKLADOWY EKRAN WYNIKOWY:

PS C:\Users\Student> .\backup.ps1
Podaj katalog do backupu: C:\Users\Student\Dokumenty

========== ROZPOCZECIE BACKUPU ==========
[1] Kopiowanie plikow... OK (47 plikow)
[2] Tworzenie archiwum ZIP... OK
[3] Czyszczenie... OK

========== BACKUP ZAKONCZONY ==========
Archiwum:  Backup_20260627_103000.zip
Rozmiar:   2456,8 KB (2,40 MB)
Plikow:    47
Zalogowano: backup_log.txt
Weryfikacja: ARCHIWUM ISTNIEJE
========================================

[zawartosc backup_log.txt:]
[2026-06-27 10:30:00] Backup: C:\Users\Student\Dokumenty
-> Backup_20260627_103000.zip | Plikow: 47 |
Rozmiar: 2.40 MB | Status: OK
9Monitor zasobów systemu – CPU, RAM, dysk

Cel zadania (~20 min)

Napisz skrypt monitor.ps1, który pobiera i wyświetla aktualne informacje o wykorzystaniu zasobów systemowych: pamięci RAM, procesora i dysków twardych. Skrypt ostrzega po przekroczeniu progów krytycznych. Poznasz Get-CimInstance, obliczenia w PowerShell i warunkowe ostrzeżenia.

Wymagania

  1. Pobierz informacje o pamięci RAM: całkowita, wolna, używana, procent użycia (Win32_OperatingSystem).
  2. Pobierz obciążenie procesora (Win32_Processor, właściwość LoadPercentage).
  3. Pobierz informacje o dyskach logicznych (Win32_LogicalDisk z filtrem DriveType=3).
  4. Wyświetl czytelny raport z kolorowaniem: zielony = OK, żółty = ostrzeżenie, czerwony = krytyczny.
  5. Zdefiniuj progi: RAM > 90% = krytyczny, > 80% = ostrzeżenie; Dysk > 90% = krytyczny; CPU > 90% = krytyczny.
  6. Zapisz raport do pliku monitor_log.txt z datą i godziną.

Wskazówki

Get-CimInstance Win32_OperatingSystem ma TotalVisibleMemorySize i FreePhysicalMemory (w KB). Get-CimInstance Win32_Processor ma LoadPercentage. Dysk: Size i FreeSpace (w bajtach). Konwersja: / 1GB dla bajtów, / 1MB dla KB → GB. [math]::Round() zaokrągla liczby.

Efekt działania

Skrypt wyświetla kolorowy raport z użyciem RAM (z podziałem na całkowitą/wolną/użytą + procent), CPU i każdego dysku. Przekroczenie progów skutkuje wyraźnym ostrzeżeniem. Raport jest zapisywany do pliku.

# Zadanie 9: Monitor zasobow systemu
# Cel: Get-CimInstance, progi ostrzegawcze

$log = "monitor_log.txt"
$data = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

Write-Host "========== MONITOR ZASOBOW SYSTEMU ==========" `
    -ForegroundColor Yellow
Write-Host "Data: $data"
Write-Host ""

# ----- RAM -----
$os = Get-CimInstance Win32_OperatingSystem
$ramTotal = [math]::Round($os.TotalVisibleMemorySize / 1MB, 1)
$ramFree  = [math]::Round($os.FreePhysicalMemory / 1MB, 1)
$ramUsed  = $ramTotal - $ramFree
$ramPct   = [math]::Round(($ramUsed / $ramTotal) * 100, 1)

$kolorRAM = if ($ramPct -gt 90) { "Red" }
            elseif ($ramPct -gt 80) { "Yellow" }
            else { "Green" }

Write-Host "--- PAMIEC RAM ---" -ForegroundColor Cyan
Write-Host ("Calkowita: {0,8:N1} GB" -f $ramTotal)
Write-Host ("Uzyta:    {0,8:N1} GB ({1:N1}%)" -f $ramUsed, $ramPct)
Write-Host ("Wolna:    {0,8:N1} GB" -f $ramFree)
Write-Host ("Status:   ") -NoNewline
Write-Host ("{0:N1}%" -f $ramPct) -ForegroundColor $kolorRAM
if ($ramPct -gt 90) {
    Write-Host "  >>> KRYTYCZNY: Ponad 90% RAM uzyte!" `
        -ForegroundColor Red
} elseif ($ramPct -gt 80) {
    Write-Host "  >>> OSTRZEZENIE: Ponad 80% RAM uzyte!" `
        -ForegroundColor Yellow
}

# ----- CPU -----
$cpu = Get-CimInstance Win32_Processor
$cpuLoad = $cpu.LoadPercentage

$kolorCPU = if ($cpuLoad -gt 90) { "Red" }
            elseif ($cpuLoad -gt 75) { "Yellow" }
            else { "Green" }

Write-Host "`n--- PROCESOR ---" -ForegroundColor Cyan
Write-Host ("Model: {0}" -f $cpu.Name)
Write-Host ("Rdzenie: {0}" -f $cpu.NumberOfCores)
Write-Host ("Obciazenie: ") -NoNewline
Write-Host ("{0}%" -f $cpuLoad) -ForegroundColor $kolorCPU
if ($cpuLoad -gt 90) {
    Write-Host "  >>> KRYTYCZNY: Ponad 90% CPU!" `
        -ForegroundColor Red
}

# ----- DYSKI -----
$dyski = Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3"

foreach ($d in $dyski) {
    $totalGB = [math]::Round($d.Size / 1GB, 1)
    $freeGB  = [math]::Round($d.FreeSpace / 1GB, 1)
    $usedGB  = $totalGB - $freeGB
    $pct     = [math]::Round(($usedGB / $totalGB) * 100, 1)

    $kolorD = if ($pct -gt 90) { "Red" }
              elseif ($pct -gt 80) { "Yellow" }
              else { "Green" }

    Write-Host "`n--- DYSK $($d.DeviceID) ---" -ForegroundColor Cyan
    Write-Host ("Calkowity: {0,8:N1} GB" -f $totalGB)
    Write-Host ("Uzyty:     {0,8:N1} GB ({1:N1}%)" -f $usedGB, $pct)
    Write-Host ("Wolny:     {0,8:N1} GB" -f $freeGB)
    Write-Host ("Status:    ") -NoNewline
    Write-Host ("{0:N1}%" -f $pct) -ForegroundColor $kolorD
    if ($pct -gt 90) {
        Write-Host "  >>> KRYTYCZNY: Ponad 90% dysku uzyte!" `
            -ForegroundColor Red
    }
}

Write-Host "`n============================================" `
    -ForegroundColor Yellow

# ----- LOG DO PLIKU -----
$raportLog = @"
[$data] MONITOR ZASOBOW
RAM: $ramUsed GB / $ramTotal GB ($ramPct%)
CPU: $cpuLoad%
"@
foreach ($d in $dyski) {
    $totalGB = [math]::Round($d.Size / 1GB, 1)
    $freeGB  = [math]::Round($d.FreeSpace / 1GB, 1)
    $usedGB  = $totalGB - $freeGB
    $pct     = [math]::Round(($usedGB / $totalGB) * 100, 1)
    $raportLog += "`nDysk $($d.DeviceID): $usedGB GB / $totalGB GB ($pct%)"
}
Add-Content -Path $log -Value $raportLog
Write-Host "Raport zapisano: $log" -ForegroundColor Gray
PRZYKLADOWY EKRAN WYNIKOWY:

PS C:\Users\Student> .\monitor.ps1
========== MONITOR ZASOBOW SYSTEMU ==========
Data: 2026-06-27 10:35:00

--- PAMIEC RAM ---
Calkowita:     15,9 GB
Uzyta:         11,2 GB (70,5%)
Wolna:          4,7 GB
Status:       70,5%

--- PROCESOR ---
Model: Intel(R) Core(TM) i7-10750H
Rdzenie: 6
Obciazenie: 45%

--- DYSK C: ---
Calkowity:   475,0 GB
Uzyty:       235,4 GB (49,6%)
Wolny:       239,6 GB
Status:      49,6%

============================================
Raport zapisano: monitor_log.txt
10Raport HTML o usługach systemowych – ConvertTo-Html

Cel zadania (~20 min)

Stwórz skrypt raport_uslug.ps1, który generuje profesjonalną stronę HTML z listą usług systemowych (Get-Service), formatuje dane i otwiera stronę w przeglądarce. Poznasz ConvertTo-Html, Out-File, Invoke-Item i osadzanie CSS w raporcie.

Wymagania

  1. Pobierz wszystkie usługi systemowe (Get-Service).
  2. Wybierz właściwości: Name, DisplayName, Status, StartType, ServiceType.
  3. Przygotuj filtr – zapytaj użytkownika czy pokazać wszystkie, tylko uruchomione czy tylko zatrzymane.
  4. Wygeneruj stronę HTML za pomocą ConvertTo-Html z własnym nagłówkiem i stylem CSS.
  5. Dodaj kolorowanie wierszy: zielony dla Running, czerwony dla Stopped.
  6. Zapisz plik usługi.html i otwórz go w przeglądarce (Invoke-Item).
  7. Wyświetl podsumowanie: liczba usług (Running, Stopped, ogółem).

Wskazówki

Get-Service zwraca usługi z właściwościami Status i StartType. ConvertTo-Html -Property ... -Head $css -Title "..." tworzy stronę. Do kolorowania wierszy w HTML możesz użyć inline <style> z klasami CSS. Invoke-Item plik.html otwiera plik w domyślnej przeglądarce.

Efekt działania

Skrypt generuje estetyczną stronę HTML z tabelą usług systemowych, kolorowaniem wierszy według statusu, filtrowaniem i datą wygenerowania. Strona otwiera się automatycznie w przeglądarce.

# Zadanie 10: Raport HTML o uslugach
# Cel: ConvertTo-Html, formatowanie CSS

$plik = "uslugi.html"

Write-Host "========== RAPORT USLUG SYSTEMOWYCH ==========" `
    -ForegroundColor Yellow

Write-Host "Wybierz zakres uslug:"
Write-Host "  1 - Wszystkie uslugi"
Write-Host "  2 - Tylko uruchomione (Running)"
Write-Host "  3 - Tylko zatrzymane (Stopped)"
$wybor = Read-Host "Twoj wybor (1-3)"

$uslugi = Get-Service
switch ($wybor) {
    "2" { $uslugi = $uslugi | Where-Object { `
        $_.Status -eq 'Running' } }
    "3" { $uslugi = $uslugi | Where-Object { `
        $_.Status -eq 'Stopped' } }
}

$ileRunning = ($uslugi | Where-Object `
    { $_.Status -eq 'Running' }).Count
$ileStopped = ($uslugi | Where-Object `
    { $_.Status -eq 'Stopped' }).Count

$css = @"
<style>
    body { font-family: 'Segoe UI', Arial; margin: 30px;
           background: #f4f7f6; }
    h1 { color: #2c3e50; border-bottom: 3px solid #e74c3c;
         padding-bottom: 10px; }
    .info { color: #555; margin-bottom: 20px; }
    table { border-collapse: collapse; width: 100%;
            box-shadow: 0 2px 8px rgba(0,0,0,0.1); }
    th { background: #2c3e50; color: white; padding: 10px;
         text-align: left; font-size: 0.9em; }
    td { border: 1px solid #ddd; padding: 8px;
         font-size: 0.85em; }
    tr:nth-child(even) { background: #f9f9f9; }
    tr:hover { background: #e8f4f8; }
    .Running { color: #27ae60; font-weight: bold; }
    .Stopped { color: #e74c3c; font-weight: bold; }
    .footer { margin-top: 20px; font-size: 0.8em;
              color: #999; text-align: center; }
    .summary { background: #ecf0f1; padding: 15px;
               border-radius: 5px; margin-bottom: 20px; }
    .summary span { margin-right: 20px; }
    .badge { padding: 3px 10px; border-radius: 3px;
             color: white; font-size: 0.85em; }
    .badge-green { background: #27ae60; }
    .badge-red { background: #e74c3c; }
    .badge-gray { background: #95a5a6; }
</style>
"@

$preContent = @"
<h1>Raport uslug systemowych</h1>
<p class="info">Wygenerowano: <strong>
$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')</strong></p>
<div class="summary">
    <span>Ogolem: <strong>$($uslugi.Count)</strong></span>
    <span>Uruchomione: <strong class="badge badge-green">
    $ileRunning</strong></span>
    <span>Zatrzymane: <strong class="badge badge-red">
    $ileStopped</strong></span>
</div>
"@

$html = $uslugi | Select-Object Name, DisplayName, Status,
    StartType, ServiceType |
    ConvertTo-Html -Title "Raport uslug systemowych" `
        -Head $css -PreContent $preContent

$html | Out-File -FilePath $plik -Encoding UTF8
Write-Host "`nRaport zapisano: $plik" -ForegroundColor Green
Write-Host "Ogolem: $($uslugi.Count), " -NoNewline
Write-Host "Running: $ileRunning, Stopped: $ileStopped"
Write-Host "Otwieram w przegladarce..." -ForegroundColor Cyan
Invoke-Item $plik
PRZYKLADOWY EKRAN WYNIKOWY:

PS C:\Users\Student> .\raport_uslug.ps1
========== RAPORT USLUG SYSTEMOWYCH ==========
Wybierz zakres uslug:
  1 - Wszystkie uslugi
  2 - Tylko uruchomione (Running)
  3 - Tylko zatrzymane (Stopped)
Twoj wybor (1-3): 1

Raport zapisano: uslugi.html
Ogolem: 256, Running: 142, Stopped: 114
Otwieram w przegladarce...

[otwiera sie strona HTML:]
+--------------------------------------------------+
|  Raport uslug systemowych                         |
|  Wygenerowano: 2026-06-27 10:40:00                |
|                                                    |
|  [Ogolem: 256] [Uruchomione: 142] [Zatrzymane: 114]|
|                                                    |
|  Name    | DisplayName      | Status   | StartType |
|  --------+------------------+----------+-----------|
|  AudioEndpointBu... | Budowa... | Running  | Manual   |
|  BFE      | Base Filtering... | Running  | Auto     |
|  BDESVC   | BitLocker...      | Stopped  | Manual   |
|  ...      | ...              | ...      | ...      |
+--------------------------------------------------+
+Podsumowanie – 10 zadań, 10 umiejętności PowerShell

Co opanowałeś?

Wykonując powyższe zadania, zdobyłeś praktyczne umiejętności z zakresu:

Zadanie Kluczowe polecenia Umiejętność
1Write-Host, Read-Host, Get-Date, $PSVersionTablePodstawy PowerShell, zmienne, kolory
2[int], -match, -f, -gt/-lt/-eqArytmetyka, walidacja, formatowanie
3Get-ChildItem, Where-Object, Sort-Object, Measure-ObjectOperacje na plikach, statystyki
4Get-Process, Stop-Process, Group-Object, try-catchZarządzanie procesami, obsługa błędów
5for, Get-Random, [char], [PSCustomObject]Pętle, generowanie danych, tablice
6do-until, switch, function, Clear-HostMenu interaktywne, funkcje, pętle
7Select-String, Group-Object, ForEach-ObjectWyszukiwanie tekstu, grupowanie
8Copy-Item, Compress-Archive, Add-ContentBackup, archiwizacja, logowanie
9Get-CimInstance, Win32_OperatingSystem, Win32_ProcessorMonitorowanie systemu, WMI, progi
10Get-Service, ConvertTo-Html, Out-File, Invoke-ItemGenerowanie raportów HTML, usługi

Każde zadanie wykorzystuje wyłącznie standardowe polecenia PowerShell dostępne w systemie Windows bez dodatkowych instalacji. Wszystkie skrypty są w pełni kompatybilne z PowerShell 5.1 (Windows 10/11) i PowerShell 7.x.

   PowerShell
  +------------+
  | Zad 1      |  Hello, PowerShell!
  | Zad 2      |  Kalkulator
  | Zad 3      |  Eksplorator plikow
  | Zad 4      |  Menedzer procesow
  | Zad 5      |  Generator hasel
  | Zad 6      |  Menu interaktywne
  | Zad 7      |  Wyszukiwarka tekstu
  | Zad 8      |  System backupu
  | Zad 9      |  Monitor zasobow
  | Zad 10     |  Raport HTML
  +------------+
     \        /
      \------/
        /\
       /  \
      /    \
  PowerShell