Do wykonania jedno, dowolne zadanie.

1Analizator katalogu – statystyki plików

Cel zadania (~20 min)

Stwórz skrypt analizator.cmd, który analizuje wskazany katalog i zbiera szczegółowe statystyki: liczbę plików, sumaryczny rozmiar, średnią wielkość pliku, największy plik oraz podział według rozszerzeń.

Wymagania

  1. Poproś użytkownika o ścieżkę katalogu do analizy; jeśli nie podano – użyj bieżącego (.).
  2. Sprawdź czy katalog istnieje – jeśli nie, wyświetl błąd i zakończ.
  3. Użyj for /R do rekurencyjnego przejścia przez wszystkie pliki.
  4. Policz pliki, zsumuj rozmiary (%%~zf), znajdź największy.
  5. Wyświetl raport z podziałem na MB/KB dla czytelności.

Wskazówki

%%~zf zwraca rozmiar pliku w bajtach. setlocal enabledelayedexpansion jest potrzebne, ponieważ zmienne modyfikowane są wewnątrz pętli for. Do konwersji bajtów na MB użyj dzielenia: set /a mb=bajty/1048576.

Efekt działania

Skrypt wypisuje czytelny raport: liczbę plików, sumę bajtów (w MB/KB), średni rozmiar pliku oraz nazwę i rozmiar największego pliku.

@echo off
setlocal enabledelayedexpansion
title Analizator katalogu
color 0B

set /p TARGET=Podaj katalog (ENTER = biezacy): 
if "%TARGET%"=="" set TARGET=.
if not exist "%TARGET%" (
    echo BLAD: Katalog '%TARGET%' nie istnieje!
    pause
    exit /b 1
)

echo Analizuje: %TARGET%
echo Prosze czekac...

set /a count=0
set /a total=0
set /a max_size=0
set max_file=

for /R "%TARGET%" %%f in (*) do (
    set /a count+=1
    set /a size=%%~zf
    set /a total+=!size!
    if !size! GTR !max_size! (
        set max_size=!size!
        set max_file=%%f
    )
)

cls
echo ======================================
echo         RAPORT Z ANALIZY KATALOGU
echo ======================================
echo.
echo  Sciezka:      %TARGET%
echo  Plikow:       %count%
echo  Suma:         %total% bajtow

if %total% GTR 1073741824 (
    set /a val=total/1073741824
    echo               (%val% GB)
) else if %total% GTR 1048576 (
    set /a val=total/1048576
    echo               (%val% MB)
) else if %total% GTR 1024 (
    set /a val=total/1024
    echo               (%val% KB)
)

if %count% GTR 0 (
    set /a avg=total/count
    echo  Srednio:      %avg% bajtow/plik
)
echo.
if not "!max_file!"=="" (
    echo  Najwiekszy:   !max_file!
    echo  Rozmiar:      !max_size! bajtow
)
echo.
echo ======================================
pause
PRZYKLADOWY EKRAN WYNIKOWY:

Podaj katalog (ENTER = biezacy): C:\Users\Student\Dokumenty
Analizuje: C:\Users\Student\Dokumenty
Prosze czekac...

[ekran czyszczony]
======================================
         RAPORT Z ANALIZY KATALOGU
======================================

 Sciezka:      C:\Users\Student\Dokumenty
 Plikow:       47
 Suma:         12589456 bajtow
               (12 MB)
 Srednio:      267861 bajtow/plik

 Najwiekszy:   C:\Users\Student\Dokumenty\raport.pdf
 Rozmiar:      2456789 bajtow

======================================
Nacisnij dowolny klawisz...

Pętla for /R przeszukuje rekurencyjnie wszystkie podkatalogi, co przy bardzo dużych strukturach (tysiące plików) może znacząco wydłużyć czas działania skryptu. W takich przypadkach warto rozważyć ograniczenie głębokości przeszukiwania lub użycie dir /s /b z potokowym przetwarzaniem. Modyfikator %%~zf zwraca rozmiar pliku w bajtach jako 32-bitową liczbę całkowitą, co oznacza, że dla plików większych niż ~2.1 GB nastąpi przepełnienie (overflow) i wynik będzie nieprawidłowy. W systemach z plikami przekraczającymi ten rozmiar należy użyć alternatywnych narzędzi, takich jak PowerShell. Wartość %errorlevel% po pętli for nie jest wiarygodnym wskaźnikiem sukcesu – jeśli pętla nie znajdzie żadnych plików, zmienne pozostaną niezainicjalizowane, co może prowadzić do błędów składniowych przy próbie porównania arytmetycznego.

W praktyce analizatory katalogów są używane jako narzędzia audytowe do identyfikacji największych przestrzeni dyskowych, wykrywania nietypowo dużych plików lub monitorowania wzrostu danych w czasie. Rozszerzeniem tego zadania może być zapisanie wyników do pliku CSV z datą pomiaru, co pozwoli na śledzenie historii zmian.

2Raport konfiguracji sieci – diagnostyka

Cel zadania (~20 min)

Napisz skrypt siec.cmd, który automatycznie zbiera informacje o konfiguracji sieciowej komputera, zapisuje je do pliku raportu, wykonuje test łączności (ping) i wyszukuje adres IPv4 w wynikach.

Wymagania

  1. Wygeneruj plik raport_sieci.txt z datą i godziną w nagłówku.
  2. Zapisz do pliku pełne wyniki ipconfig /all.
  3. Użyj find do wyodrębnienia linii zawierających "IPv4" i wyświetl je na ekranie.
  4. Wykonaj ping -n 4 google.pl i zapisz wynik do raportu.
  5. Sprawdź %errorlevel% po pingu – wyświetl komunikat "Polaczenie dziala" lub "BRAK polaczenia".
  6. Na koniec wyświetl podgląd raportu poleceniem type.

Wskazówki

Przekierowanie >> dopisuje do pliku. find z przełącznikiem /i ignoruje wielkość liter. Wynik pingowania zapisz przekierowując do pliku, a jednocześnie sprawdź %errorlevel%.

Efekt działania

Skrypt tworzy kompletny raport sieciowy w pliku, wyświetla adres IPv4, testuje łączność i pokazuje podsumowanie.

@echo off
setlocal
title Raport konfiguracji sieci
color 0F

set RAPORT=raport_sieci.txt

echo ======================================
echo    GENERATOR RAPORTU KONFIGURACJI SIECI
echo ======================================
echo.

echo ================================== > %RAPORT%
echo RAPORT KONFIGURACJI SIECIOWEJ >> %RAPORT%
echo Data: %date%  Czas: %time% >> %RAPORT%
echo ================================== >> %RAPORT%

echo [1] Zapisuje konfiguracje sieci...
echo. >> %RAPORT%
echo ---- ipconfig /all ---- >> %RAPORT%
ipconfig /all >> %RAPORT% 2>&1
echo OK.

echo [2] Wyszukuje adresy IPv4...
echo.
echo === ADRESY IPv4 W SYSTEMIE ===
find /i "IPv4" %RAPORT%
if %errorlevel% NEQ 0 (
    echo (nie znaleziono adresow IPv4)
)
echo ==============================
echo.

echo [3] Test polaczenia z internetem...
echo. >> %RAPORT%
echo ---- ping google.pl ---- >> %RAPORT%
ping -n 4 google.pl >> %RAPORT% 2>&1

if %errorlevel% EQU 0 (
    echo [OK] Polaczenie z internetem dziala.
    echo Status polaczenia: DZIALA >> %RAPORT%
) else (
    echo [UWAGA] Brak polaczenia z internetem!
    echo Status polaczenia: BRAK >> %RAPORT%
)
echo.

echo [4] Podglad wygenerowanego raportu:
echo ======================================
echo.
type %RAPORT%
echo.
echo ======================================
echo Raport zapisany: %RAPORT%
pause
PRZYKLADOWY EKRAN WYNIKOWY:

======================================
    GENERATOR RAPORTU KONFIGURACJI SIECI
======================================

[1] Zapisuje konfiguracje sieci... OK.
[2] Wyszukuje adresy IPv4...

=== ADRESY IPv4 W SYSTEMIE ===
    IPv4 Address. . . . . . . . . . . : 192.168.1.101
    IPv4 Address. . . . . . . . . . . : 10.0.0.2
==============================

[3] Test polaczenia z internetem...
[OK] Polaczenie z internetem dziala.

[4] Podglad wygenerowanego raportu:
======================================

==================================
RAPORT KONFIGURACJI SIECIOWEJ
...
==================================
Nacisnij dowolny klawisz...

Wynik polecenia ipconfig /all może być bardzo obszerny, szczególnie w systemach z wieloma kartami sieciowymi (fizycznymi, wirtualnymi, VPN). Użycie find /i "IPv4" pozwala szybko wyodrębnić interesujące nas informacje, ale warto pamiętać, że w starszych wersjach Windows lub w systemach z wyłączonym protokołem IPv6 można spotkać się z etykietą "IP Address" zamiast "IPv4 Address". W bardziej zaawansowanych skryptach sieciowych często używa się netsh interface ip show config zamiast ipconfig, ponieważ zwraca bardziej ustrukturyzowane dane. Polecenie ping z przełącznikiem -n 4 wysyła 4 pakiety ICMP; domyślnie cmd.exe wysyła 4 pakiety, ale liczbę można zmienić dla dokładniejszego testu. Wartość %errorlevel% po ping wynosi 0, gdy wszystkie pakiety dotarły, oraz 1, gdy wystąpił jakikolwiek błąd – nie odróżnia jednak całkowitego braku łączności od sporadycznych strat pakietów.

Diagnostyka sieciowa z poziomu batcha jest często używana w skryptach logowania do sprawdzenia dostępności serwerów domenowych, drukarek sieciowych lub zasobów plikowych. Rozszerzeniem zadania może być zapisanie historii testów ping do pliku CSV z datą i średnim czasem odpowiedzi, co pozwoli na analizę jakości łącza w czasie.

3Menedżer procesów – monitorowanie i zarządzanie

Cel zadania (~20 min)

Stwórz skrypt procesy.cmd, który wyświetla listę procesów, filtruje je według kryteriów (nazwa, użycie pamięci), zapisuje do pliku CSV i umożliwia zakończenie wybranego procesu.

Wymagania

  1. Uruchom tasklist /FO CSV i przekieruj wynik do pliku procesy.csv.
  2. Użyj for /F do wczytania pliku CSV i wyświetlenia procesów.
  3. Zapytaj użytkownika o minimalną wielkość pamięci (w KB) – wyświetl tylko procesy przekraczające ten próg.
  4. Zapytaj o nazwę procesu do zabicia – wykonaj taskkill /IM nazwa /F.
  5. Sprawdź %errorlevel% i poinformuj o wyniku operacji.

Wskazówki

tasklist /FO CSV /NH pomija nagłówek CSV. Rozdzielanie pól CSV w for /F wymaga ustawienia delims=,. Pole "NazwaObrazu" ma cudzysłowy – użyj %%~a aby je usunąć.

Efekt działania

Skrypt generuje plik CSV z procesami, filtruje według pamięci, umożliwia zabicie procesu i raportuje wynik.

@echo off
setlocal enabledelayedexpansion
title Menedzer procesow
color 0C

echo ======================================
echo       MENEDZER PROCESOW SYSTEMU
echo ======================================
echo.

echo [1] Generuje liste procesow...
tasklist /FO CSV /NH > procesy.csv 2>nul
echo  OK - lista zapisana do procesy.csv

echo [2] Filtrowanie po uzyciu pamieci...
set /p MIN_MEM=Podaj minimalna pamiec w KB (0 = wszystkie): 
if "%MIN_MEM%"=="" set MIN_MEM=0
echo.

echo Procesy uzywajace wiecej niz %MIN_MEM% KB:
echo -------------------------------------------
set /a licznik=0
for /F "usebackq delims=, tokens=1,2,3,4,5" %%a in ("procesy.csv") do (
    set nazwa=%%~a
    set pid=%%~b
    set sesja=%%~c
    set numer=%%~d
    set pamiec=%%~e
    set pamiec=!pamiec:"=!
    set pamiec=!pamiec:  =!
    if not "!pamiec!"=="" (
        set /a mb=!pamiec:/=0!
        if !mb! GEQ %MIN_MEM% (
            set /a licznik+=1
            echo  !nazwa!  PID:!pid!  Pamiec:!pamiec! KB
        )
    )
)
echo -------------------------------------------
echo  Znaleziono: !licznik! procesow
echo.

echo [3] Zabijanie procesu...
set /p ZABIJ=Podaj nazwe procesu do zabicia (np. notepad.exe): 
if not "%ZABIJ%"=="" (
    taskkill /IM "%ZABIJ%" /F >nul 2>&1
    if !errorlevel! EQU 0 (
        echo  [OK] Proces %ZABIJ% zostal zakonczony.
    ) else (
        echo  [BLAD] Nie udalo sie zabic procesu %ZABIJ%.
    )
)

echo.
del procesy.csv 2>nul
pause
PRZYKLADOWY EKRAN WYNIKOWY:

======================================
       MENEDZER PROCESOW SYSTEMU
======================================

[1] Generuje liste procesow... OK
[2] Filtrowanie po uzyciu pamieci...
Podaj minimalna pamiec w KB (0 = wszystkie): 50000

Procesy uzywajace wiecej niz 50000 KB:
-------------------------------------------
  chrome.exe  PID:1234  Pamiec:245000 KB
  explorer.exe  PID:567  Pamiec:85000 KB
  python.exe  PID:890  Pamiec:62000 KB
-------------------------------------------
  Znaleziono: 3 procesow

[3] Zabijanie procesu...
Podaj nazwe procesu do zabicia (np. notepad.exe): notepad.exe
  [BLAD] Nie udalo sie zabic procesu notepad.exe.

Nacisnij dowolny klawisz...

Parsowanie pliku CSV wygenerowanego przez tasklist /FO CSV jest wrażliwe na ustawienia regionalne systemu. W polskich wersjach Windows separator dziesiętny to przecinek, co powoduje, że kolumna pamięci (np. 8 456 K z separatorem tysięcy) może być nieprawidłowo dzielona przez delims=,. W praktyce oznacza to, że wartość w %%~e może zawierać tylko część liczby. Rozwiązaniem jest użycie tasklist /FO CSV /NH z angielskim locale lub zastosowanie pętli for /F z skip=1 i ręczne czyszczenie wartości. Polecenie taskkill /IM z przełącznikiem /F wymusza zamknięcie procesu, co może spowodować utratę niezapisanych danych – w środowisku produkcyjnym zaleca się najpierw próbę zamknięcia bez /F (wysyła sygnał WM_CLOSE).

Menedżery procesów w batchu znajdują zastosowanie w skryptach porządkowych na serwerach terminalowych (zabijanie nieaktywnych sesji), monitorowaniu krytycznych procesów (auto-restart gdy proces przestaje działać) oraz przygotowywaniu środowiska przed testami. Rozszerzeniem zadania może być dodanie opcji zapisu do pliku CSV z godziną dla celów audytowych.

4Synchronizacja katalogów – narzędzie ROBOCOPY

Cel zadania (~20 min)

Stwórz skrypt synchro.cmd, który synchronizuje dwa katalogi za pomocą robocopy. Skrypt tworzy kopię lustrzaną katalogu źródłowego w katalogu docelowym, loguje wszystkie operacje i raportuje wynik.

Wymagania

  1. Poproś o ścieżkę źródłową i docelową.
  2. Sprawdź czy katalog źródłowy istnieje – jeśli nie, zakończ z błędem.
  3. Jeśli katalog docelowy nie istnieje – utwórz go.
  4. Użyj robocopy z przełącznikami /MIR (mirror), /LOG+:log.txt (log dopisywany), /NP (bez postępu), /R:2 (2 ponowienia).
  5. Sprawdź %errorlevel% robocopy:
  6. Kod Znaczenie
    0Brak kopiowania (wszystko aktualne)
    1Skopiowano pliki (sukces)
    2+Dodatkowe zdarzenia
    8+Błąd krytyczny
  7. Wyświetl podsumowanie i plik logu.

Efekt działania

Katalog docelowy staje się lustrzanym odbiciem źródłowego. Plik logu zawiera historię operacji. Na ekranie widoczne jest podsumowanie.

@echo off
setlocal
title Synchronizacja katalogow - ROBOCOPY
color 0A

set LOG=synchro_log.txt

echo ======================================
echo    NARZEDZIE DO SYNCHRONIZACJI KATALOGOW
echo ======================================
echo.

set /p SOURCE=Podaj katalog zrodlowy: 
set /p DEST=Podaj katalog docelowy: 

if "%SOURCE%"=="" set SOURCE=.
if "%DEST%"=="" (
    echo BLAD: Nie podano katalogu docelowego!
    pause
    exit /b 1
)

if not exist "%SOURCE%" (
    echo BLAD: Katalog zrodlowy '%SOURCE%' nie istnieje!
    pause
    exit /b 1
)

if not exist "%DEST%" (
    mkdir "%DEST%"
    echo [INFO] Utworzono katalog docelowy: %DEST%
)

echo.
echo Synchronizuje: %SOURCE% -^> %DEST%
echo.

echo %date% %time% - Synchronizacja: %SOURCE% ^> %DEST% >> %LOG%
echo ================ >> %LOG%

robocopy "%SOURCE%" "%DEST%" /MIR /LOG+:%LOG% /NP /R:2 /W:3

set RC=%errorlevel%
echo.
echo ======================================
echo         PODSUMOWANIE SYNCHRONIZACJI
echo ======================================
echo  Kod zakonczenia: %RC%

if %RC% GEQ 8 (
    echo  Status: BLAD KRYTYCZNY - sprawdz log!
) else if %RC% GEQ 4 (
    echo  Status: OSTRZEZENIE - czesc operacji sie nie powiodla.
) else if %RC% EQU 1 (
    echo  Status: Sukces - skopiowano pliki.
) else if %RC% EQU 0 (
    echo  Status: Brak zmian - wszystko aktualne.
) else (
    echo  Status: Sukces z dodatkowymi zdarzeniami.
)

echo.
echo Ostatnie linie pliku log:
echo -------------------------------------
type %LOG%
echo -------------------------------------
echo.
pause
PRZYKLADOWY EKRAN WYNIKOWY:

======================================
    NARZEDZIE DO SYNCHRONIZACJI KATALOGOW
======================================

Podaj katalog zrodlowy: C:\Projekt\Dokumenty
Podaj katalog docelowy: D:\Backup\Dokumenty
Synchronizuje: C:\Projekt\Dokumenty -> D:\Backup\Dokumenty

[wyniki dzialania robocopy]

======================================
         PODSUMOWANIE SYNCHRONIZACJI
======================================
  Kod zakonczenia: 1
  Status: Sukces - skopiowano pliki.

Ostatnie linie pliku log:
-------------------------------------
[log entries...]
-------------------------------------
Nacisnij dowolny klawisz...

Narzędzie robocopy (Robust File Copy) zostało wprowadzone w Windows Vista jako następca xcopy i oferuje znacznie więcej możliwości, w tym wielowątkowe kopiowanie (/MT), ponawianie przerwanych transferów (/Z) oraz obsługę kopii lustrzanej (/MIR). Przełącznik /MIR jest szczególnie niebezpieczny, ponieważ usuwa pliki w katalogu docelowym, których nie ma w źródle – przypadkowe pomylenie parametrów może skutkować utratą danych. Dlatego przed synchronizacją zawsze warto wykonać próbę suchą z przełącznikiem /L (list only), który pokazuje, co zostanie zrobione bez faktycznego kopiowania. Kody wyjścia robocopy są maskami bitowymi: 0 = brak zmian, 1 = skopiowano pliki, 2 = dodatkowe katalogi, 4 = niezgodności, 8 += błędy krytyczne; sumują się, więc kod 3 oznacza skopiowano pliki + dodatkowe katalogi.

Synchronizacja katalogów jest podstawą strategii backupu w środowiskach Windows. W praktyce robocopy jest używane w skryptach planowanych (Task Scheduler) do codziennej replikacji danych między serwerami, tworzenia kopii zapasowych na nośniki wymienne oraz migracji danych między stacjami. Rozszerzeniem zadania może być dodanie opcji kopii przyrostowej z logowaniem do pliku nazwanego datą backupu.

5Generator strony HTML – automatyczne raporty WWW

Cel zadania (~20 min)

Stwórz skrypt genhtml.cmd, który generuje stronę HTML z raportem systemowym. Nauczysz się tworzyć pliki HTML z poziomu batcha, używać zmiennych do wstrzykiwania danych do szablonu i formatować kod HTML z poziomu skryptu.

Wymagania

  1. Wygeneruj plik raport.html z pełnym szkieletem HTML5.
  2. Umieść w nagłówku tytuł: "Raport systemowy – %date%"
  3. W treści strony zapisz: nazwę komputera, użytkownika, datę, czas, system operacyjny.
  4. Dodaj tabelę z listą plików w bieżącym katalogu (kolumny: nazwa, rozmiar, data).
  5. Użyj kolorów CSS inline do formatowania (tło, nagłówek tabeli).
  6. Na końcu otwórz plik w domyślnej przeglądarce poleceniem start.

Wskazówki

Każdą linię HTML zapisuj osobnym echo z przekierowaniem >>. Do generowania wierszy tabeli z plików użyj pętli for %%f in (*) do. Sprawdź czy plik istnieje po wygenerowaniu.

Efekt działania

Przeglądarka otwiera się z profesjonalnie wyglądającą stroną HTML zawierającą dane systemowe i listę plików.

@echo off
setlocal
title Generator strony HTML
color 0D

set PLIK=raport.html

echo ======================================
echo      GENERATOR STRONY HTML Z RAPORTEM
echo ======================================
echo.

echo ^<^!DOCTYPE html^> > %PLIK%
echo ^ >> %PLIK%
echo ^ >> %PLIK%
echo ^ >> %PLIK%
echo ^Raport systemowy - %date%^ >> %PLIK%
echo ^ >> %PLIK%
echo body { font-family: Arial; margin: 30px; } >> %PLIK%
echo h1 { color: #2c3e50; border-bottom: 3px solid #e74c3c; } >> %PLIK%
echo table { border-collapse: collapse; width: 100%%; } >> %PLIK%
echo th { background: #2c3e50; color: white; padding: 8px; } >> %PLIK%
echo td { border: 1px solid #ddd; padding: 6px; } >> %PLIK%
echo tr:nth-child(even) { background: #f9f9f9; } >> %PLIK%
echo ^ >> %PLIK%
echo ^ >> %PLIK%
echo ^ >> %PLIK%

echo ^Raport systemowy^ >> %PLIK%
echo ^Wygenerowano: %date% o %time%^ >> %PLIK%
echo. >> %PLIK%

echo ^Dane systemowe^ >> %PLIK%
echo ^ >> %PLIK%
echo ^^Komputer^^%computername%^^ >> %PLIK%
echo ^^Uzytkownik^^%username%^^ >> %PLIK%
echo ^^System^^%os%^^ >> %PLIK%
echo ^ >> %PLIK%
echo. >> %PLIK%

echo ^Lista plikow^ >> %PLIK%
echo ^ >> %PLIK%
echo ^^Nazwa^^Rozmiar^^Data^^ >> %PLIK%

for %%f in (*) do (
    echo ^^%%f^^%%~zf bajtow^^%%~tf^^ >> %PLIK%
)

echo ^ >> %PLIK%
echo ^ >> %PLIK%
echo ^ >> %PLIK%

echo [OK] Wygenerowano: %PLIK%
dir %PLIK%
echo.
echo Otwieram w przegladarce...
start %PLIK%
timeout /t 3 /nobreak >nul
PRZYKLADOWY EKRAN WYNIKOWY:

======================================
      GENERATOR STRONY HTML Z RAPORTEM
======================================

[OK] Wygenerowano: raport.html
raport.html         1 234 bajtow   15.04.2026  14:35:22

Otwieram w przegladarce...

[przegladarka otwiera sie ze strona:]
+---------------------------------------------------+
|  Raport systemowy                                  |
|  Wygenerowano: 15.04.2026 o 14:35:22              |
|                                                    |
|  Dane systemowe                                    |
|  +------------+------------------+                |
|  | Komputer   | LAPTOP-ABC123    |                |
|  | Uzytkownik | student          |                |
|  | System     | Windows_NT       |                |
|  +------------+------------------+                |
|                                                    |
|  Lista plikow                                      |
|  +-----------+---------+------------+             |
|  | Nazwa     | Rozmiar | Data       |             |
|  +-----------+---------+------------+             |
|  | raport... | 1234 b. | 15-04-2026 |             |
|  +-----------+---------+------------+             |
+---------------------------------------------------+

Generowanie HTML z poziomu batcha wymaga starannego escapowania znaków specjalnych. Znaki < i > muszą być poprzedzone daszkiem (^<, ^>), ponieważ cmd.exe interpretuje je jako operatory przekierowania. Znak procentu w arkuszu stylów CSS (100%) również wymaga podwojenia (100%%). Większym wyzwaniem są polskie znaki diakrytyczne – cmd.exe domyślnie działa w kodowaniu OEM (CP852), podczas gdy przeglądarki oczekują UTF-8. Dlatego w generowanym HTML warto jawnie ustawić <meta charset="UTF-8"> i zapisać skrypt w kodowaniu ANSI, licząc, że Windows dokona automatycznej konwersji. W praktyce do generowania złożonych raportów HTML lepiej użyć PowerShella, który natywnie obsługuje UTF-8 i oferuje większe możliwości formatowania.

Automatyczne generowanie stron HTML z batcha znajduje zastosowanie w tworzeniu prostych pulpitów monitoringowych, raportów z testów automatycznych oraz zestawień danych systemowych dla działów IT. Rozszerzeniem zadania może być dodanie wykresów słupkowych w CSS (prostokąty div z dynamiczną szerokością) oraz osadzenie daty w nazwie pliku dla wersjonowania raportów.

6Przeszukiwanie plików – findstr i wyszukiwarka tekstu

Cel zadania (~20 min)

Stwórz skrypt szukaj.cmd, który przeszukuje pliki w katalogu (rekurencyjnie) pod kątem zadanego tekstu. Nauczysz się używać findstr z wyrażeniami regularnymi, for /R do iteracji i sort do porządkowania wyników.

Wymagania

  1. Poproś użytkownika o katalog do przeszukania i szukany tekst.
  2. Użyj findstr /s /m /i do rekurencyjnego szukania tekstu w plikach.
  3. Wyświetl (i zapisz do pliku) listę plików zawierających szukany tekst.
  4. Policz liczbę znalezionych plików i wyświetl statystykę.
  5. Dodaj opcję /c: do wyszukiwania fraz ze spacjami.
  6. Posortuj wyniki alfabetycznie za pomocą sort.

Wskazówki

findstr /s przeszukuje podkatalogi. /m wyświetla tylko nazwy plików (nie linie). /i ignoruje wielkość liter. /n pokazuje numery linii. Przykład: findstr /s /m /i /c:"kod bledu" *.log.

Efekt działania

Skrypt znajduje wszystkie pliki zawierające zadany tekst, wyświetla posortowaną listę z liczbą wyników i zapisuje raport do pliku.

@echo off
setlocal
title Wyszukiwarka tekstu w plikach
color 0E

set WYNIKI=wyniki_wyszukiwania.txt

echo ======================================
echo    PRZESZUKIWANIE PLIKOW - FINDSTR
echo ======================================
echo.

set /p SCIEZKA=Podaj katalog do przeszukania: 
if "%SCIEZKA%"=="" set SCIEZKA=.

if not exist "%SCIEZKA%" (
    echo BLAD: Katalog '%SCIEZKA%' nie istnieje!
    pause
    exit /b 1
)

set /p SZUKAJ=Podaj szukany tekst: 
if "%SZUKAJ%"=="" (
    echo BLAD: Nie podano tekstu do wyszukania!
    pause
    exit /b 1
)

set /p MASKAPlikow=Podaj maske plikow (ENTER = *.*): 
if "%MASKAPlikow%"=="" set MASKAPlikow=*.*

echo.
echo Szukam: "%SZUKAJ%" w %SCIEZKA%\%MASKAPlikow%
echo.

findstr /s /m /i /c:"%SZUKAJ%" "%SCIEZKA%\%MASKAPlikow%" > %WYNIKI% 2>nul

if %errorlevel% EQU 0 (
    set /a liczba=0
    for /F %%f in (%WYNIKI%) do set /a liczba+=1
    
    echo Znalezione pliki (posortowane):
    echo ====================================
    type %WYNIKI% | sort
    echo ====================================
    echo.
    echo Znaleziono: %liczba% plikow zawierajacych "%SZUKAJ%"
) else if %errorlevel% EQU 1 (
    echo Nie znaleziono plikow zawierajacych "%SZUKAJ%".
    echo 0 > %WYNIKI%
) else (
    echo BLAD: Wystapil problem podczas wyszukiwania.
    echo Kod bledu: %errorlevel%
)

echo.
echo Wyniki zapisano w: %WYNIKI%
type %WYNIKI%
pause
PRZYKLADOWY EKRAN WYNIKOWY:

======================================
    PRZESZUKIWANIE PLIKOW - FINDSTR
======================================

Podaj katalog do przeszukania: C:\Logi
Podaj szukany tekst: blad
Podaj maske plikow (ENTER = *.*): *.log

Szukam: "blad" w C:\Logi\*.log

Znalezione pliki (posortowane):
====================================
C:\Logi\apache\error.log
C:\Logi\system\ dzienny.log
C:\Logi\aplikacja.log
====================================

Znaleziono: 3 plikow zawierajacych "blad"

Wyniki zapisano w: wyniki_wyszukiwania.txt
C:\Logi\apache\error.log
C:\Logi\system\dienny.log
C:\Logi\aplikacja.log
Nacisnij dowolny klawisz...

findstr to znacznie potężniejsze narzędzie niż podstawowe find – obsługuje wyrażenia regularne (/R), wyszukiwanie dosłownych fraz (/C:), wyszukiwanie w podkatalogach (/S) oraz zwracanie tylko nazw plików (/M). Przełącznik /C: jest kluczowy przy frazach zawierających spacje, ponieważ traktuje cały argument jako jeden dosłowny wzorzec, a nie listę słów rozdzielonych spacjami (co jest domyślnym zachowaniem). Warto pamiętać, że findstr ma ograniczone wsparcie dla wyrażeń regularnych – nie obsługuje na przykład \d, \w ani grup przechwytywania. Do zaawansowanych analiz tekstu lepiej użyć PowerShella z Select-String. Kod błędu %errorlevel% po findstr wynosi 0 gdy znaleziono dopasowania, 1 gdy nie znaleziono, a 2 gdy wystąpił błąd składni wzorca.

Wyszukiwanie tekstu w plikach jest podstawową czynnością przy analizie logów, debugowaniu aplikacji i inspekcji kodu źródłowego. W środowiskach produkcyjnych skrypty z findstr są używane do monitorowania logów systemowych w poszukiwaniu błędów krytycznych, automatycznego przeszukiwania plików konfiguracyjnych czy walidacji poprawności plików danych. Rozszerzeniem zadania może być dodanie opcji wykluczania katalogów (/XD dla for /R) oraz zapisu wyników z numerami linii.

7Generator struktury projektu – kreator szablonów

Cel zadania (~20 min)

Stwórz skrypt projekt.cmd, który w interaktywny sposób generuje kompletną strukturę katalogów i plików dla nowego projektu programistycznego. Skrypt będzie pytał o nazwę projektu, wybór języka i tworzył odpowiednie pliki szablonowe.

Wymagania

  1. Poproś o nazwę projektu – utwórz katalog główny o tej nazwie.
  2. Wyświetl menu wyboru typu projektu: 1 – Python, 2 – HTML, 3 – Batch.
  3. W zależności od wyboru utwórz odpowiednią strukturę:
    • Python: src/, docs/, tests/, plik main.py, requirements.txt
    • HTML: css/, js/, img/, plik index.html, style.css
    • Batch: scripts/, logs/, backup/, plik run.cmd, README.txt
  4. Utwórz pliki z przykładową zawartością (szkielet kodu).
  5. Wyświetl wygenerowaną strukturę za pomocą tree /F.

Efekt działania

W bieżącym katalogu powstaje nowy katalog projektu z kompletną strukturą i plikami startowymi. Użytkownik widzi drzewo katalogów.

@echo off
setlocal
title Kreator struktury projektu
color 0B

echo ======================================
echo     KREATOR STRUKTURY PROJEKTU
echo ======================================
echo.

set /p PROJEKT=Podaj nazwe projektu: 
if "%PROJEKT%"=="" (
    echo BLAD: Nie podano nazwy projektu!
    pause
    exit /b 1
)

if exist "%PROJEKT%" (
    echo BLAD: Katalog '%PROJEKT%' juz istnieje!
    pause
    exit /b 1
)

echo.
echo Wybierz typ projektu:
echo  1 - Python
echo  2 - HTML/CSS/JS
echo  3 - Batch/CMD
echo.
set /p WYBOR=Twoj wybor (1-3): 

mkdir "%PROJEKT%"

if "%WYBOR%"=="1" goto python
if "%WYBOR%"=="2" goto html
if "%WYBOR%"=="3" goto batch
echo BLAD: Nieprawidlowy wybor. Tworze domyslny.
goto batch

:python
mkdir "%PROJEKT%\src" "%PROJEKT%\docs" "%PROJEKT%\tests"
echo print("Hello from %PROJEKT%!") > "%PROJEKT%\src\main.py"
echo # %PROJEKT% > "%PROJEKT%\requirements.txt"
echo # Testy do %PROJEKT% > "%PROJEKT%\tests\__init__.py"
echo %date% - Projekt %PROJEKT% utworzony. > "%PROJEKT%\README.txt"
goto koniec

:html
mkdir "%PROJEKT%\css" "%PROJEKT%\js" "%PROJEKT%\img"
echo ^ > "%PROJEKT%\index.html"
echo ^^ >> "%PROJEKT%\index.html"
echo ^%PROJEKT%^ >> "%PROJEKT%\index.html"
echo ^ >> "%PROJEKT%\index.html"
echo ^^ >> "%PROJEKT%\index.html"
echo ^%PROJEKT%^ >> "%PROJEKT%\index.html"
echo ^^ >> "%PROJEKT%\index.html"
echo /* Style dla %PROJEKT% */ > "%PROJEKT%\css\style.css"
echo // JavaScript dla %PROJEKT% > "%PROJEKT%\js\script.js"
goto koniec

:batch
mkdir "%PROJEKT%\scripts" "%PROJEKT%\logs" "%PROJEKT%\backup"
echo @echo off > "%PROJEKT%\run.cmd"
echo title %PROJEKT% >> "%PROJEKT%\run.cmd"
echo echo Witaj w projekcie %PROJEKT%! >> "%PROJEKT%\run.cmd"
echo pause >> "%PROJEKT%\run.cmd"
echo %date% - Projekt %PROJEKT% > "%PROJEKT%\README.txt"
goto koniec

:koniec
cls
echo ======================================
echo   STRUKTURA PROJEKTU: %PROJEKT%
echo ======================================
echo.
tree "%PROJEKT%" /F
echo.
echo Projekt zostal utworzony.
echo.
pause
PRZYKLADOWY EKRAN WYNIKOWY:

======================================
     KREATOR STRUKTURY PROJEKTU
======================================

Podaj nazwe projektu: MojaAplikacja

Wybierz typ projektu:
  1 - Python
  2 - HTML/CSS/JS
  3 - Batch/CMD

Twoj wybor (1-3): 2

[ekran czyszczony]
======================================
   STRUKTURA PROJEKTU: MojaAplikacja
======================================

MojaAplikacja
├───css
│       style.css
├───img
├───js
│       script.js
└───index.html

Projekt zostal utworzony.

Nacisnij dowolny klawisz...

Skrypt wykorzystuje etykiety (:python, :html, :batch) i instrukcję goto do implementacji menu wyboru – jest to najprostszy i najbardziej czytelny sposób tworzenia interaktywnych skryptów w cmd.exe. Warto jednak pamiętać, że etykiety wewnątrz nawiasów bloków if są interpretowane nieprawidłowo, dlatego konstrukcja menu oparta na goto jest bezpieczniejsza niż zagnieżdżone if-else. Polecenie mkdir akceptuje wiele argumentów w jednej linii, co pozwala na szybkie tworzenie całej struktury katalogów. Znak ^> w echo to escapowanie znaku > przed interpretacją jako przekierowanie – bez daszka cmd.exe uznałby >> za operator dopisywania do pliku. Polecenie tree /F wyświetla drzewo katalogów z plikami, ale dostępne jest tylko w nowszych wersjach Windows – w starszych systemach może być niedostępne.

Kreatory struktury projektów są powszechnie używane w środowiskach developerskich do standaryzacji początkowych szablonów. W praktyce takie skrypty są często rozszerzane o generowanie plików konfiguracyjnych (.gitignore, .editorconfig) oraz integrację z systemem kontroli wersji (automatyczne git init). Rozszerzeniem zadania może być dodanie opcji tworzenia repozytorium Git oraz generowania pliku LICENSE.

8System zbiorczej zmiany nazw plików – batch rename

Cel zadania (~20 min)

Stwórz skrypt zmien_nazwy.cmd, który umożliwia zbiorczą zmianę nazw plików według różnych reguł: dodanie prefiksu, dodanie sufiksu, zmiana rozszerzenia, dodanie numeracji. Skrypt ma działać bezpiecznie – najpierw pokazać podgląd, potem pytać o potwierdzenie.

Wymagania

  1. Poproś o maskę plików (np. *.txt) i katalog.
  2. Wyświetl menu operacji: 1 – dodaj prefiks, 2 – dodaj sufiks, 3 – zmień rozszerzenie, 4 – dodaj numerację.
  3. Dla opcji 1-2 poproś o tekst do dodania.
  4. Dla opcji 3 poproś o nowe rozszerzenie.
  5. Dla opcji 4 dodaj kolejny numer przed rozszerzeniem (plik_01.txt, plik_02.txt...).
  6. Najpierw wyświetl podgląd zmian (stara nazwa → nowa nazwa) i zapytaj o potwierdzenie.
  7. Dopiero po potwierdzeniu wykonaj faktyczne ren.

Wskazówki

Użyj pętli for %%f in (mask) do. Zmienna %%~nf to nazwa bez rozszerzenia, %%~xf to rozszerzenie. Do formatowania liczb (01, 02...) w batchu: if !licznik! LSS 10 set "num=0!licznik!".

Efekt działania

Użytkownik widzi podgląd proponowanych zmian i decyduje czy je zatwierdzić. Pliki są bezpiecznie zmieniane.

@echo off
setlocal enabledelayedexpansion
title Zbiorcza zmiana nazw plikow
color 0C

echo ======================================
echo       ZBIORCZA ZMIANA NAZW PLIKOW
echo ======================================
echo.
echo UWAGA: Skrypt dziala w BIEZACYM katalogu!
echo.

set /p MASKA=Podaj maske plikow (np. *.txt): 
if "%MASKA%"=="" set MASKA=*.*

set /a ile=0
for %%f in (%MASKA%) do set /a ile+=1 2>nul
if %ile% EQU 0 (
    echo Brak plikow pasujacych do maski %MASKA%
    pause
    exit /b 1
)

echo.
echo Wybierz operacje:
echo  1 - Dodaj prefiks (na poczatek nazwy)
echo  2 - Dodaj sufiks (przed rozszerzeniem)
echo  3 - Zmien rozszerzenie
echo  4 - Dodaj numeracje
echo.
set /p OP=Twoj wybor (1-4): 
if "%OP%"=="" set OP=1

if "%OP%"=="1" set /p DODATEK=Podaj prefiks: 
if "%OP%"=="2" set /p DODATEK=Podaj sufiks: 
if "%OP%"=="3" set /p DODATEK=Podaj nowe rozszerzenie (bez kropki): 
if "%OP%"=="4" set DODATEK=num

echo.
echo === PODGLAD ZMIAN ===
echo Lp.  Stara nazwa            ^| Nowa nazwa
echo --------------------------------------------
set /a licznik=0
for %%f in (%MASKA%) do (
    set /a licznik+=1
    set stara=%%f
    set nazwa=%%~nf
    set rozsz=%%~xf
    
    if "%OP%"=="1" set nowa=!DODATEK!!nazwa!!rozsz!
    if "%OP%"=="2" set nowa=!nazwa!!DODATEK!!rozsz!
    if "%OP%"=="3" set nowa=!nazwa!.!DODATEK!
    if "%OP%"=="4" (
        set /a num=licznik
        if !num! LSS 10 set num=0!num!
        set nowa=!nazwa!_!num!!rozsz!
    )
    echo  !licznik!  !stara!  ^| !nowa!
)
echo --------------------------------------------
echo Znaleziono: %licznik% plikow
echo.

set /p POTWIERDZ=Wykonac zmiany? (T/N): 
if /I "%POTWIERDZ%" NEQ "T" (
    echo Anulowano.
    pause
    exit /b 0
)

set /a licznik=0
for %%f in (%MASKA%) do (
    set /a licznik+=1
    set nazwa=%%~nf
    set rozsz=%%~xf
    
    if "%OP%"=="1" (
        ren "%%f" "!DODATEK!!nazwa!!rozsz!"
    ) else if "%OP%"=="2" (
        ren "%%f" "!nazwa!!DODATEK!!rozsz!"
    ) else if "%OP%"=="3" (
        ren "%%f" "!nazwa!.!DODATEK!"
    ) else if "%OP%"=="4" (
        set /a num=licznik
        if !num! LSS 10 set num=0!num!
        ren "%%f" "!nazwa!_!num!!rozsz!"
    )
)

echo.
echo Zmieniono !licznik! plikow.
pause
PRZYKLADOWY EKRAN WYNIKOWY:

======================================
       ZBIORCZA ZMIANA NAZW PLIKOW
======================================

Podaj maske plikow (np. *.txt): *.jpg

Wybierz operacje:
  1 - Dodaj prefiks (na poczatek nazwy)
  2 - Dodaj sufiks (przed rozszerzeniem)
  3 - Zmien rozszerzenie
  4 - Dodaj numeracje

Twoj wybor (1-4): 1
Podaj prefiks: wakacje_

=== PODGLAD ZMIAN ===
Lp.  Stara nazwa            | Nowa nazwa
--------------------------------------------
  1   photo1.jpg             | wakacje_photo1.jpg
  2   photo2.jpg             | wakacje_photo2.jpg
  3   selfie.jpg             | wakacje_selfie.jpg
--------------------------------------------
Znaleziono: 3 plikow

Wykonac zmiany? (T/N): T

Zmieniono 3 plikow.
Nacisnij dowolny klawisz...

Bezpieczeństwo operacji na plikach jest kluczowe – dlatego skrypt najpierw wyświetla podgląd zmian, a dopiero po potwierdzeniu wykonuje faktyczne ren. W bardziej zaawansowanych wersjach warto dodać opcję cofnięcia zmian (undo) poprzez zapisanie mapowania starych i nowych nazw do pliku dziennika. Polecenie ren ma ograniczenia: nie może zmienić ścieżki pliku (tylko nazwę), nie działa na plikach ukrytych ani systemowych bez odpowiednich uprawnień oraz może nie działać poprawnie, gdy nowa nazwa już istnieje. W takich przypadkach ren zwraca błąd bez dalszej informacji, dlatego warto sprawdzać %errorlevel% po każdej operacji. Formatowanie numerów z wiodącym zerem (01, 02) w batchu wymaga ręcznego sprawdzenia, czy licznik jest mniejszy od 10, i dodania zera – nie ma wbudowanej funkcji formatowania.

Zbiorcza zmiana nazw plików jest niezbędna przy porządkowaniu kolekcji zdjęć (dodawanie daty do nazwy), standaryzacji nazewnictwa plików w projektach (konwersja na snake_case) oraz przygotowywaniu danych do dalszego przetworzenia. Rozszerzeniem zadania może być dodanie opcji usuwania znaków specjalnych z nazw plików oraz wsparcia dla podkatalogów.

9System backupu z weryfikacją – xcopy + FC

Cel zadania (~20 min)

Stwórz skrypt backup_weryfikacja.cmd, który wykonuje kopię zapasową plików, a następnie weryfikuje jej poprawność za pomocą fc (File Compare). Skrypt tworzy manifest plików i raport porównania, aby upewnić się, że backup jest identyczny z oryginałem.

Wymagania

  1. Poproś o katalog źródłowy i docelowy.
  2. Sprawdź czy katalog źródłowy istnieje; jeśli docelowy nie – utwórz go.
  3. Wykonaj kopię za pomocą xcopy /E /I /Y.
  4. Po kopii wygeneruj manifest plików w źródle i backupie (dir /s /b).
  5. Dla każdego pliku uruchom fc /b (porównanie binarne) i zapisz wynik do pliku weryfikacji.
  6. Policz liczbę plików zgodnych i różniących się – wyświetl podsumowanie.
  7. Jeśli wszystkie pliki są zgodne – wyświetl "Backup poprawny".

Wskazówki

fc /b plik1 plik2 2>nul porównuje pliki binarnie. %errorlevel% po fc = 0 gdy pliki identyczne, 1 gdy różne. Użyj for /F do iteracji po liście plików z manifestu. Uwaga: fc dla dużych plików może być wolne – do testów używaj małych plików.

Efekt działania

Po wykonaniu kopii skrypt dokładnie weryfikuje każdy plik i generuje raport zgodności.

@echo off
setlocal enabledelayedexpansion
title System backupu z weryfikacja
color 0A

set RAPORT_FC=weryfikacja_fc.txt

echo ======================================
echo    BACKUP Z WERYFIKACJA - XCOPY + FC
echo ======================================
echo.

set /p SOURCE=Podaj katalog zrodlowy: 
set /p DEST=Podaj katalog docelowy backupu: 

if "%SOURCE%"=="" set SOURCE=.
if "%DEST%"=="" (
    echo BLAD: Nie podano katalogu docelowego!
    pause
    exit /b 1
)

if not exist "%SOURCE%" (
    echo BLAD: Katalog zrodlowy nie istnieje!
    pause
    exit /b 1
)
if not exist "%DEST%" mkdir "%DEST%"

echo [1] Kopiowanie plikow za pomoca xcopy...
xcopy "%SOURCE%" "%DEST%" /E /I /Y >nul 2>&1
if %errorlevel% GEQ 4 (
    echo BLAD KRYTYCZNY podczas kopiowania!
    pause
    exit /b 1
)
echo  OK.
echo.

echo [2] Weryfikacja plikow (fc /b)...
echo RAPORT WERYFIKACJI BACKUPU > %RAPORT_FC%
echo Data: %date% %time% >> %RAPORT_FC%
echo ================================ >> %RAPORT_FC%

set /a zgodne=0
set /a rozne=0
set /a blad=0

for /R "%SOURCE%" %%f in (*) do (
    set src=%%f
    set rel=%%~pnxf
    if "!rel:~0,1!"=="\" set rel=!rel:~1!
    set dst=%DEST%\!rel!
    
    if exist "!dst!" (
        fc /b "%%f" "!dst!" >nul 2>&1
        if !errorlevel! EQU 0 (
            set /a zgodne+=1
        ) else (
            set /a rozne+=1
            echo ROZNY: !src! >> %RAPORT_FC%
        )
    ) else (
        set /a blad+=1
    )
)

echo. >> %RAPORT_FC%
echo Podsumowanie: >> %RAPORT_FC%
echo Plikow zgodnych: %zgodne% >> %RAPORT_FC%
echo Plikow roznych:  %rozne% >> %RAPORT_FC%
echo Blad odczytu:    %blad% >> %RAPORT_FC%

echo.
echo === WERYFIKACJA ZAKONCZONA ===
echo Plikow zgodnych: %zgodne%
echo Plikow roznych:  %rozne%
if %rozne% EQU 0 (
    echo.
    echo [OK] Backup POPRAWNY - wszystkie pliki zgodne!
) else (
    echo [UWAGA] Niektore pliki sie roznia - sprawdz raport!
)

echo.
echo Raport weryfikacji: %RAPORT_FC%
type %RAPORT_FC%
echo.
rem Czyszczenie zakonczone
pause
PRZYKLADOWY EKRAN WYNIKOWY:

======================================
    BACKUP Z WERYFIKACJA - XCOPY + FC
======================================

Podaj katalog zrodlowy: C:\Projekt\Dokumenty
Podaj katalog docelowy backupu: D:\Backup

[1] Kopiowanie plikow za pomoca xcopy... OK.
[2] Weryfikacja plikow (fc /b)....

=== WERYFIKACJA ZAKONCZONA ===
Plikow zgodnych: 12
Plikow roznych:  0

[OK] Backup POPRAWNY - wszystkie pliki zgodne!

Raport weryfikacji: weryfikacja_fc.txt
RAPORT WERYFIKACJI BACKUPU
...
Podsumowanie:
Plikow zgodnych: 12
Plikow roznych:  0
...
Nacisnij dowolny klawisz...

Porównanie binarne fc /b to najdokładniejsza metoda weryfikacji kopii – sprawdza każdy bajt pliku i informuje o różnicach. Jest to jednak proces wolny dla dużych plików (setki MB), ponieważ wymaga sekwencyjnego odczytu całej zawartości. W praktyce do weryfikacji backupów często używa się sum kontrolnych (certutil -hashfile), które pozwalają na szybkie porównanie bez odczytu całego pliku. Polecenie xcopy jest starszym narzędziem od robocopy i ma mniej opcji, ale jest prostsze w użyciu i dostępne we wszystkich wersjach Windows. Przełącznik /E kopiuje podkatalogi (również puste), /I zakłada, że cel to katalog, a /Y pomija potwierdzenia nadpisu. Kod błędu xcopy >= 4 oznacza błąd krytyczny.

Weryfikacja backupu jest krytycznym elementem strategii przechowywania danych – kopia zapasowa, której nie można zweryfikować, nie jest wiarygodna. W środowiskach produkcyjnych stosuje się zasadę 3-2-1 (3 kopie, 2 nośniki, 1 poza siedzibą). Rozszerzeniem zadania może być dodanie generowania sum SHA-256 dla każdego pliku oraz opcji przyrostowej kopii z kompresją.

10Analizator plików dziennika – log analyzer

Cel zadania (~20 min)

Stwórz skrypt loganalizator.cmd, który analizuje pliki dziennika (logi), wyodrębnia błędy, ostrzeżenia i informacje, grupuje je, zlicza i generuje czytelny raport podsumowujący. Nauczysz się zaawansowanego przetwarzania plików tekstowych w batchu.

Wymagania

  1. Poproś o katalog z plikami .log i maskę plików (domyślnie *.log).
  2. Dla każdego pliku .log w katalogu:
    • Policz całkowitą liczbę linii (find /c /v "").
    • Policz linie zawierające "ERROR" lub "BLAD" (find /c /i).
    • Policz linie zawierające "WARN" lub "UWAGA" (find /c /i).
  3. Wygeneruj zbiorczy raport analiza_logow.txt.
  4. Wyświetl tabelę z wynikami na ekranie.
  5. Jeśli w jakimś pliku liczba błędów przekracza próg (np. 5), oznacz go jako "KRYTYCZNY".
  6. Posortuj pliki według liczby błędów (malejąco).

Wskazówki

find /c /v "" zlicza niepuste linie. find /i "ERROR" szuka tekstu ignorując wielkość liter. Użyj tymczasowego pliku do sortowania. Do formatowania tabeli użyj echo z odpowiednią liczbą kropek/spacji.

Efekt działania

Skrypt generuje tabelę z nazwami plików, liczbą linii, błędów i ostrzeżeń, oznacza pliki krytyczne i zapisuje raport do pliku.

@echo off
setlocal enabledelayedexpansion
title Analizator plikow dziennika
color 0E

set RAPORT=analiza_logow.txt
set /a PROG=5

echo ======================================
echo     ANALIZATOR PLIKOW DZIENNIKA
echo ======================================
echo.

set /p KATALOG=Podaj katalog z logami (ENTER = biezacy): 
if "%KATALOG%"=="" set KATALOG=.

if not exist "%KATALOG%" (
    echo BLAD: Katalog '%KATALOG%' nie istnieje!
    pause
    exit /b 1
)

set /p MASKA=Podaj maske plikow (ENTER = *.log): 
if "%MASKA%"=="" set MASKA=*.log

echo. > %RAPORT%
echo ================================ >> %RAPORT%
echo RAPORT ANALIZY LOGOW >> %RAPORT%
echo Data: %date%  Czas: %time% >> %RAPORT%
echo Katalog: %KATALOG% >> %RAPORT%
echo ================================ >> %RAPORT%
echo. >> %RAPORT%

echo %date% %time% > sorted.txt

set /a lp=0
echo.
echo Przetwarzanie plikow...
echo.

for %%f in ("%KATALOG%\%MASKA%") do (
    if exist "%%f" (
        set /a lp+=1
        
        for /F %%c in ('find /c /v "" ^< "%%f" 2^>nul') do set /a total=%%c
        for /F %%c in ('find /i /c "ERROR" ^< "%%f" 2^>nul') do set /a error=%%c
        for /F %%c in ('find /i /c "WARN" ^< "%%f" 2^>nul') do set /a warn=%%c
        for /F %%c in ('find /i /c "BLAD" ^< "%%f" 2^>nul') do set /a blad_pl=%%c
        
        set /a lacznie_bledow=error+blad_pl
        
        set nazwa=%%~nxf
        
        echo !error!-!lp!-!nazwa!-!total!-!lacznie_bledow!-!warn! >> sorted.txt
    )
)

echo.
echo ======================================
echo          RAPORT ANALIZY LOGOW
echo ======================================
echo.

echo  Lp. Plik            Linie  Bledy  Warn  Status
echo  --- ---------------- ------ ------ ----- --------
echo  --- ---------------- ------ ------ ----- -------- >> %RAPORT%

sort /r sorted.txt > temp_sorted.txt
set /a poz=0

for /F "tokens=1-6 delims=-" %%a in (temp_sorted.txt) do (
    set /a poz+=1
    set bledy=%%a
    set numer=%%b
    set nazwa=%%c
    set linie=%%d
    set bledy_lacz=%%e
    set warn=%%f
    
    if !poz! GTR 1 (
        set status=OK
        if !bledy_lacz! GEQ %PROG% set status=KRYTYCZNY
        
        set sp1=               
        set sp2=               
        set sp3=               
        set sp4=               
        
        echo !poz! !nazwa!!sp1:~0,20! !linie!!sp2:~0,8! !bledy_lacz!!sp3:~0,8! !warn!!sp4:~0,8! !status!
        echo !poz! !nazwa!!sp1:~0,20! !linie!!sp2:~0,8! !bledy_lacz!!sp3:~0,8! !warn!!sp4:~0,8! !status! >> %RAPORT%
    )
)

echo  --- ---------------- ------ ------ ----- -------- >> %RAPORT%
echo. >> %RAPORT%
echo Przetworzono plikow: %lp% >> %RAPORT%
echo Prog krytyczny: >=%PROG% bledow >> %RAPORT%

echo  --- ---------------- ------ ------ ----- --------
echo.
echo Przetworzono plikow: %lp%
echo Raport zapisano: %RAPORT%

del sorted.txt temp_sorted.txt 2>nul
echo.
pause
PRZYKLADOWY EKRAN WYNIKOWY:

======================================
     ANALIZATOR PLIKOW DZIENNIKA
======================================

Podaj katalog z logami: C:\Logi
Podaj maske plikow: *.log

Przetwarzanie plikow...

======================================
          RAPORT ANALIZY LOGOW
======================================

 Lp. Plik            Linie  Bledy  Warn  Status
 --- ---------------- ------ ------ ----- --------
 2   apache.log       1500    12      3    KRYTYCZNY
 1   system.log        800     2      5    OK
 3   debug.log         450     0      1    OK
 --- ---------------- ------ ------ ----- --------

Przetworzono plikow: 3
Raport zapisano: analiza_logow.txt
Nacisnij dowolny klawisz...

Analiza logów w batchu wykorzystuje find /c /v "" do zliczania linii niepustych – przełącznik /c zlicza linie pasujące do wzorca, a /v odwraca dopasowanie (wybiera linie niezawierające wzorca). W połączeniu daje to liczbę wszystkich niepustych linii. Wyszukiwanie błędów wymaga osobnych wywołań find /c /i "ERROR" i find /c /i "BLAD", co dla dużej liczby plików może być nieefektywne. Sortowanie wyników według liczby błędów realizowane jest przez plik tymczasowy z prefiksem liczbowym – to sprytna sztuczka, ale wrażliwa na znaki - w nazwach plików (użyty separator). W bardziej zaawansowanych analizatorach logów warto rozważyć użycie findstr /R z wyrażeniem regularnym do wykrywania różnych formatów błędów.

Analiza dzienników zdarzeń jest podstawą monitorowania systemów IT. W praktyce takie skrypty są używane do codziennego przeglądu logów serwerów, wykrywania prób włamań (wielokrotne nieudane logowania) oraz monitorowania wydajności (ostrzeżenia o przekroczeniu progów). Rozszerzeniem zadania może być dodanie analizy przedziałów czasowych, wysyłanie powiadomień e-mail przy krytycznych błędach oraz generowanie wykresów w HTML.

+Podsumowanie – 10 zadań, 10 umiejętności

Co opanowałeś?

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

Zadanie Kluczowe polecenia Umiejętność
1for /R, %%~zf, set /aAnaliza plików, pętle, arytmetyka
2ipconfig, find, pingDiagnostyka sieci, przekierowania
3tasklist, taskkill, CSVZarządzanie procesami, parsowanie CSV
4robocopy /MIR, errorlevelSynchronizacja, kody wyjścia
5echo, >>, startGenerowanie HTML, szablony
6findstr /s /m, sortWyszukiwanie tekstu, regex
7mkdir, tree, gotoStruktury katalogów, menu
8ren, %%~nf, %%~xfBatch rename, podgląd zmian
9xcopy, fc /b, manifestBackup, weryfikacja integralności
10find /c, sort /r, analizaPrzetwarzanie logów, sortowanie

Każde zadanie wykorzystuje wyłącznie standardowe polecenia systemu Windows dostępne w każdym cmd.exe bez dodatkowych instalacji.

   cmd.exe
  +--------+
  | Zad 1  |  Analiza katalogu
  | Zad 2  |  Diagnostyka sieci
  | Zad 3  |  Zarzadzanie procesami
  | Zad 4  |  Synchronizacja
  | Zad 5  |  Generowanie HTML
  | Zad 6  |  Wyszukiwanie tekstu
  | Zad 7  |  Struktura projektu
  | Zad 8  |  Zmiana nazw plikow
  | Zad 9  |  Backup z weryfikacja
  | Zad 10 |  Analiza logow
  +--------+
  \   BAT/CMD  /
   \         /
    \-------/
        

Wykonanie wszystkich dziesięciu zadań daje solidne podstawy do samodzielnego pisania skryptów wsadowych w środowisku Windows. Opanowane techniki obejmują: operacje na plikach i katalogach (for, for /R, for /F), zmienne i ich zasięg (setlocal, delayed expansion), warunki (if, errorlevel), narzędzia systemowe (tasklist, robocopy, findstr, fc) oraz generowanie raportów w różnych formatach. Każde zadanie zostało zaprojektowane tak, aby wykorzystywać wyłącznie standardowe polecenia cmd.exe dostępne w każdym systemie Windows 10/11 bez dodatkowych instalacji.

Dalsze kierunki rozwoju umiejętności skryptowych obejmują: przejście do PowerShella (obiektowe podejście, .NET, zdalne zarządzanie), naukę wyrażeń regularnych (niezbędnych przy analizie tekstu), automatyzację zadań przez Task Scheduler oraz integrację skryptów z innymi narzędziami (Git, API REST, bazy danych). Solidne podstawy w cmd.exe są jednak cennym fundamentem – wiele zadań administracyjnych w Windows wciąż najszybciej i najprościej zrealizować właśnie za pomocą prostego skryptu wsadowego.