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).

Spodobał Ci się artykuł? Zapisz się do naszego Newslettera - ZERO SPAMu, same konkrety, oraz dostęp do dodatkowych materiałów przeznaczonych dla subskrybentów!
Na podany adres e-mail otrzymasz od nas wiadomość e-mail, w której znajdziesz link do potwierdzenia subskrypcji naszego Newslettera. Dzięki temu mamy pewność, że nikt nie dodał Twojego adresu przez przypadek. Jeśli wiadomość nie przyjdzie w ciągu najbliższej godziny (zazwyczaj jest to maksymalnie kilka minut) sprawdź folder SPAM.Patryk
Pasjonat nowych technologii - od sprzętu po oprogramowanie, od serwerów po smartfony i rozwiązania IoT. Potencjalnie kiepski bloger, bo nie robi zdjęć "talerza" zanim zacznie jeść.
Dumny przyjaciel swoich psów :-)
Ostatnie artykuły: Patryk (zobacz wszystkie)
- Prasówka: koniec rezerwacji domen .pl, zmiana właściciela .org, kolor roku 2020, Quora po polsku, Google i YouTube w 2019, Wasteland 2 za darmo i ciekawe Humble Bundle - 1970-01-01
- Dotarła do mnie grudniowa przesyłka Mikkeller Beer Mail, a w niej 9 piw – mniej „mocarzy” niż w wakacje (!), ale za to bardziej winnie - 1970-01-01
- Strona ZTM w nowej odsłonie, do tego portal Warszawski Transport Publiczny na WordPressie, czyli kolejna medialna gównoburza - 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.