Slajd wyjaśnia problem zależności formatu daty od ustawień regionalnych oraz prezentuje niezawodne metody pobierania stempla czasu przez WMIC i PowerShell.
Manipulacja datą i znaczniki czasu
- Niestabilność zmiennej %DATE%: kolejność dni, miesięcy i separatorów w %DATE% zależy od ustawień językowych systemu (DD.MM.RRRR vs RRRR-MM-DD vs MM/DD/YYYY).
- Błąd parsowania na obcych systemach: sztywne wycinanie podciągów %date:~-4% zawodzi po uruchomieniu skryptu na serwerze z angielskim lub niemieckim profilem językowym.
- Uniwersalne zapytanie WMIC: polecenie wmic os get localdatetime zwraca znormalizowany stempel czasu w standardzie ISO (RRRRMMDDGGMMSS).
- Jednolinijkowiec PowerShell: nowoczesna alternatywa wywołująca Get-Date -Format 'yyyyMMdd_HHmmss' z poziomu skryptu wsadowego.
Znacznik czasu ISO 8601: międzynarodowy standard zapisu daty i czasu w porządku malejącym (od roku przez miesiąc, dzień, godzinę do sekund), gwarantujący poprawne sortowanie alfabetyczne i chronologiczne plików bez względu na regionalne ustawienia językowe systemu.
@echo off
setlocal EnableDelayedExpansion
echo === Analiza daty i czasu ===
echo.
echo Systemowa data: %DATE%
echo Systemowy czas: %TIME%
echo.
:: Parsowanie daty (format: 2025-03-21)
:: UWAGA: format moze byc inny w zaleznosci od ustawien!
set "D=%DATE%"
echo Próbne parsowanie: !D!
:: Sprobuj wyciagnac rok, miesiac, dzien
:: To zalezy od formatu systemowego!
set "ROK=%DATE:~0,4%"
set "MIESIAC=%DATE:~5,2%"
set "DZIEN=%DATE:~8,2%"
echo Wydzielone: !ROK!-!MIESIAC!-!DZIEN!
echo.
:: Parsowanie czasu
set "GODZ=%TIME:~0,2%"
set "MIN=%TIME:~3,2%"
set "SEK=%TIME:~6,2%"
echo Czas: !GODZ!:!MIN!:!SEK!
echo.
:: Znacznik czasu do nazwy pliku (bez spacji)
set "TS=%DATE:~-4%%DATE:~-7,2%%DATE:~-10,2%_%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%"
set "TS=!TS: =0!"
echo Znacznik do nazwy pliku: !TS!
pause
endlocal
Poleganie na bezpośrednim wycinaniu znaków ze zmiennych %DATE% i %TIME% jest jedną z najbardziej rozpowszechnionych przyczyn awarii skryptów przy przenoszeniu ich pomiędzy stacjami roboczymi a serwerami chmurowymi. Na polskim systemie Windows data może mieć postać 24.10.2026, podczas gdy w obrazie Azure domyślnie obowiązuje format amerykański 10/24/2026.
Aby skrypt był w pełni odporny na zmiany środowiskowe, należy zastosować zapytanie do Windows Management Instrumentation: for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined mydate set mydate=%%x. Zmienna mydate otrzyma wówczas ciąg 20261024..., który jest identyczny na każdej maszynie na świecie. Alternatywą w nowszych systemach jest wywołanie powershell -NoProfile -Command "Get-Date -Format yyyy-MM-dd". Standardy formatowania czasu omawia portal SS64 Timestamping Guide.
Skróty użyte w tym slajdzie:
WMIC - Windows Management Instrumentation Command-line, interfejs wiersza poleceń do podsystemu WMI.
WMI - Windows Management Instrumentation, infrastruktura zarządzania systemem Windows.
ISO - International Organization for Standardization, międzynarodowa organizacja normalizacyjna.
LCID - Locale Identifier, identyfikator ustawień regionalnych w Windows.