Dawno, dawno temu, w czasach Windows 7 – a być może jeszcze wcześniej – stworzyłem skrypt, który z pewnych względów regularnie skanował wybrane zasoby dyskowe i ich zawartość zapisywał do pliku tekstowego. I tak sobie skrypt bezobsługowo działał, regularnie zapisywał listę (i szczegóły plików), aż dziś zwróciłem uwagę, że coś się format daty z jakim zapisywane pliki zmienił.
Formatu daty w skryptach BAT/CMD
Sam skrypt to nic skomplikowanego, jedno proste polecenie systemowe, które skanuje zdefiniowane katalogi, a wynik swojej pracy zapisuje do pliku tekstowego, którego nazwa jest ustawiana automatycznie, na podstawie daty systemowej:
dir /s /n > %date%.txt
Do niedawna wynikiem jego działania były pliki o nazwach zapisanych wg formatu:
yyyy-mm-dd.txt
Kilka miesięcy temu, zapewne podczas którejś z aktualizacji Windows 10 coś się musiało zmienić, i pliki zaczęły zapisywać się w odwrotnym formacie, czyli:
dd.mm.yyyy.txt
Niby szczegół, ale przyzwyczajony jestem, że choćby ze względu na lepszą segregację plików idziemy od roku, przez miesiąc, aż do dnia – zgodnie z częstotliwością zmian.
Niestety funkcja „date” (zmienna %date%) nie pozwala na wybranie formatu w jakim chcemy wyświetlić datę, dlatego musiałem lekko zmodyfikować skrypt, tak by najpierw wyświetlał się rok, potem miesiąc, a na końcu dzień:
set "AktualnaData=%date:~6,4%-%date:~3,2%-%date:~0,2%"
dir /s /n > %AktualnaData%.txt
Tak więc:
%date% -> 30.08.2017
%date:~6,4%-%date:~3,2%-%date:~0,2% -> 2017-08-30
%date:~6,4%.%date:~3,2%.%date:~0,2% -> 2017.08.30
%date:~6,4%%date:~3,2%%date:~0,2% -> 20170830
Co można wyjaśnić tak:
ustaw NazwaZmiennej=[7, 8, 9 i 10 znak z %data%][rozdzielacz][4 i 5 znak z %data%][rozdzielacz][1 i 2 znak z %data%]
Najpierw ustawiamy/tworzymy zmienną AktualnaData, do której podstawiamy 4 znaki licząc od 6 ze zmiennej %data% (30.08.2017), wstawiamy (lub nie) wymagany znak rozdzielający, następnie z tej samej zmiennej %data% pobieramy 2 znaki licząc od 3, dodajemy ewentualnie kolejny znak rozdzielający, i kończymy 2 pierwszymi znakami ze zmiennej %data%, dzięki czemu otrzymujemy pożądany format daty (np. 2017-08-30).
- Home Assistant 2024.11, czyli „sekcje” domyślnym widokiem z opcją migracji, WebRTC oraz wirtualna kamera - 1970-01-01
- Black Friday w ZUS, czyli jest jeszcze kilka dni, by złożyć wniosek RWS i skorzystać z wakacji składkowych płacąc ZUS za grudzień 2024 - 1970-01-01
- Wakacje składkowe ZUS a zawieszenie działalności gospodarczej, czyli uważaj, bo być może nie będziesz mógł skorzystać (w 2024) - 1970-01-01
To może dla pamięci, przypomnij co oznaczają te procenty.
Bo mi chwilę zeszło, by dojść do wniosku iż:
%date:~6,4%-%date:~3,2%-%date:~0,2% -> 2017-08-30
oznacza pobierze 4 znaki od 6 znaku itp.
W tym celu dałem przykłady, ale też doszedłem do podobnych wniosków co Ty, stąd „w nieprzyzwoicie porannych godzinach”, zaraz po powrocie ze spaceru z psami zaktualizowałem „trochę” ostatni akapit, dodając informację, która – mam nadzieję – rozjaśnia całą konstrukcję… :-)
Hej.
Akurat na podobny motyw się nadziałem, zamierzałem zatem zastosować Twoją podpowiedź.
Tknięty jednak przeczuciem sprawdziłem, iż zmiana formatu daty krótkiej w systemie daje pożądane efekty, a jest mniej kłopotliwa, bowiem nie trzeba dodawać linii w skryptach mogących komuś mniej dociekliwemu wydać się jakąś czarną magią ;-)
Pozdrawiam
Dzięki za informację, która zapewne niejednej osobie się przyda. Jednak czasem może być potrzeba użycia daty w innym formacie niż w systemie, i wtedy warto wiedzieć, jak to można zrobić :-)
Również pozdrawiam
W rzeczy samej.
Globalna zmiana rozwiązuje tylko sytuacje, w których potrzebujemy jednego, konkretnego formatu.
(Pełnych testów nie przeprowadzałem, niemniej odnoszę wrażenie, że się trochę do tego przyłożyli i można to modyfikować w zasadzie dowolnie z poziomu zmiany właśnie daty, czy to krótkiej czy długiej. Wpisując po prostu interesujący nas format sekwencji.)
W pozostałych przypadkach, zastosowanie wskazanego przez Ciebie rozwiązania będzie niezmiernie pomocne. :-)
Szczególnie gdy np potrzebujemy taką datę mieć raz w jednej, raz w innej postaci.
Muszę się z Tobą zgodzić, nie tylko dlatego, że Ty zgadzasz się ze mną ;-)
A tak serio, to pomysł na artykuł pojawił się z konieczności, gdy okazało się, że w pewnym momencie zmienił się ustawiony format daty (prawdopodobnie podczas jakiejś aktualizacji), co odbiło się na działaniu skryptu. Uznałem w tym momencie, że zostawię wersję domyślną i z niej zrobię format taki, jaki jest mi potrzebny.
Mam pytanie czy przedstawione rozwiązane jest nieczułe na czas i daty gdzie godziny i dzień są jednocyfrowe?
U mnie system zawsze zwraca dzień i miesiąc w formie liczby dwucyfrowej (z zerem na początku gdy trzeba), i do tego dostosowany jest kod podany w artykule. Jeśli jest inaczej, i z jakiegoś powodu nie możesz lub nie chcesz tego zmieniać, to trzeba kod zmodyfikować, być może dokładając też jakieś regułki, które by wykrywały czy wynik jest z zakresu 0-9, czy 10+.