Jak zapisać bieżącą datę w formacie RRRR-MM-DD w jakiejś zmiennej w pliku .bat systemu Windows?
Analog powłoki Unix:
today=`date +%F`
echo $today
windows
batch-file
Maksym Polshcha
źródło
źródło
Odpowiedzi:
Możesz uzyskać bieżącą datę w sposób niezależny od ustawień regionalnych za pomocą
Następnie możesz wyodrębnić poszczególne części za pomocą podciągów:
Innym sposobem, w którym otrzymujesz zmienne zawierające poszczególne części, byłoby:
O wiele przyjemniejsze niż majstrowanie przy podciągach kosztem zanieczyszczania przestrzeni nazw zmiennych.
Jeśli potrzebujesz czasu UTC zamiast czasu lokalnego, polecenie jest mniej więcej takie samo:
źródło
for /f
zwraca dwie linie, z których druga jest pusta. Możesz rozwiązać ten problem, używającset MyDate=
pomiędzy. Myślę, że właśnie o to natknął się user2023861.Year
,Month
,Day
,Hour
,Minute
,Second
,Quarter
,WeekInMonth
,DayOfWeek
for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x set today=%Year%-%Month%-%Day%
jest nieprawidłową odpowiedzią: zwraca jedną cyfrę miesiąca i dnia. Jak uzyskać 2-cyfrowe lewe wypełnione zerowym ciągiem miesiąca i dnia do daty?Jeśli chcesz to osiągnąć za pomocą standardowych poleceń MS-DOS w pliku wsadowym, możesz użyć:
Jestem pewien, że można to poprawić, ale daje to datę na 3 zmienne dla dnia (dd), miesiąca (mm) i roku (rrrr). W razie potrzeby można ich później użyć w skrypcie wsadowym.
Chociaż rozumiem, że odpowiedź na to pytanie została zaakceptowana, ta alternatywna metoda może być doceniona przez wielu, którzy chcą to osiągnąć bez korzystania z konsoli WMI, więc mam nadzieję, że doda ona trochę wartości do tego pytania.
źródło
Użyj,
date /T
aby znaleźć format w wierszu polecenia.Jeśli format daty jest
Thu 17/03/2016
używany w następujący sposób:źródło
SELECT CONVERT(VARCHAR(16), GETDATE(), 112)
”.%date:~10,4%%date:~7,2%%date:~4,2%T%time:~0,2%%time:~3,2%%time:~6,2%
Jeszcze dwa sposoby, które nie zależą od ustawień czasu (oba pochodzą z artykułu Jak uzyskać dane / czas niezależnie od lokalizacji ). Oba również otrzymują dzień tygodnia i żaden z nich nie wymaga uprawnień administratora !:
MAKECAB - będzie działać na KAŻDYM systemie Windows (szybko, ale tworzy mały plik tymczasowy) (skrypt foxidrive):
ROBOCOPY - nie jest to natywne polecenie dla Windows XP i Windows Server 2003 , ale można je pobrać ze strony Microsoft . Ale jest wbudowany we wszystko od Windows Vista i nowszych:
I jeszcze trzy sposoby korzystania z innych języków skryptów systemu Windows. Dadzą ci większą elastyczność, np. Możesz uzyskać tydzień w roku, czas w milisekundach i tak dalej.
Hybryda JScript / BATCH (należy zapisać jako
.bat
). JScript jest dostępny na każdym systemie od Windows NT i nowszych jako część Hosta skryptów systemu Windows ( chociaż można go wyłączyć przez rejestr, jest to rzadki przypadek ):Hybryda VBScript / BATCH ( czy możliwe jest osadzenie i wykonanie VBScript w pliku wsadowym bez użycia pliku tymczasowego? ) Ten sam przypadek co jscript, ale hybrydyzacja nie jest tak doskonała:
PowerShell - można go zainstalować na każdym komputerze z platformą .NET - pobrać z firmy Microsoft ( v1 , v2 i v3 (tylko dla Windows 7 i nowszych)). Instalowany domyślnie na wszystkim z Windows 7 / Win2008 i nowszych:
Samodzielnie skompilowany jscript.net/batch (nigdy nie widziałem komputera z systemem Windows bez .NET, więc myślę, że jest to całkiem przenośny):
Logman Nie można uzyskać roku i dnia tygodnia. Jest stosunkowo wolny, tworzy również plik tymczasowy i jest oparty na sygnaturach czasowych, które logman umieszcza w swoich plikach dziennika. Będzie działać wszystko od Windows XP i nowszych. Prawdopodobnie nigdy nie będzie używany przez nikogo - łącznie ze mną - ale to jeszcze jeden sposób ...
Więcej informacji o funkcji Get-Date .
źródło
Naprawdę podobała mi się metoda Joeya, ale pomyślałem, że trochę ją rozwinę.
W tym podejściu można uruchamiać kod wiele razy i nie martwić się, że stara wartość daty „utknie”, ponieważ jest już zdefiniowana.
Za każdym razem, gdy uruchomisz ten plik wsadowy, wygeneruje on połączoną reprezentację daty i godziny zgodną z ISO 8601.
W tej wersji musisz uważać, aby nie skopiować / wkleić tego samego kodu w wielu miejscach w pliku, ponieważ spowodowałoby to zduplikowanie etykiet. Możesz mieć osobną etykietę dla każdej kopii lub po prostu umieścić ten kod we własnym pliku wsadowym i wywołać go z pliku źródłowego, gdy jest to konieczne.
źródło
Po prostu użyj
%date%
zmiennej:źródło
Zgodnie z odpowiedzią @ProVi po prostu zmień, aby dopasować wymagane formatowanie
wróci
EDYCJA Zgodnie z komentarzem @Jeb, kto jest poprawny, powyższy format czasu będzie działał tylko wtedy, gdy polecenie DATE / T powróci
Edytowanie w celu dostosowania do ustawień regionalnych jest łatwe, jednak za pomocą indeksowania każdego znaku w ciągu zwracanym przez odpowiednią zmienną środowiskową% DATE% można wyodrębnić potrzebne części ciągu.
na przykład. Użycie% DATE ~ 10,4% spowodowałoby rozwinięcie zmiennej środowiskowej DATE, a następnie użycie tylko 4 znaków, które zaczynają się od 11. (przesunięcie 10) znaku rozszerzonego wyniku
Na przykład, jeśli używasz dat w stylu amerykańskim, obowiązują następujące zasady
źródło
Ustawiłem zmienną środowiskową na wartość w żądanym formacie liczbowym, wykonując następujące czynności:
źródło
Sprawdź ten..
źródło
Jeśli masz zainstalowany Python, możesz to zrobić
Możesz łatwo dostosować ciąg formatu do swoich potrzeb.
źródło
python -c "import datetime;print(datetime.date.today())"
, ponieważ__str__
metodadate
klasy po prostu wywołujeisoformat()
.Możliwe jest użycie programu PowerShell i przekierowanie jego danych wyjściowych do zmiennej środowiskowej przy użyciu pętli.
Z wiersza poleceń (
cmd
):W pliku wsadowym możesz uciec
%a
jako%%a
:źródło
FOR /F "tokens=*" %%a IN ('powershell get-date -format "{yyyy\-MM\-dd\THH\:mm\:ss}"') DO SET date=%%a
tak, więc użyj górnego MM dla miesiąca i ukośnika odwrotnego, aby uniknąć literałów.Ze względu na to, że format daty i czasu jest informacją specyficzną dla lokalizacji, pobranie ich ze zmiennych% date% i% time% będzie wymagało dodatkowego wysiłku, aby przeanalizować ciąg z uwzględnieniem zmiany formatu. Dobrym pomysłem jest użycie jakiegoś interfejsu API do pobrania struktury danych i przeanalizowania, jak chcesz. WMIC to dobry wybór. Poniższy przykład użyj Win32_LocalTime . Możesz także użyć Win32_CurrentTime lub Win32_UTCTime .
Wynik:
2018-04-25_10: 03: 11
źródło
Jest to rozszerzenie odpowiedzi Joeya, które obejmuje czas i wypełnia części zerami.
Na przykład wynikiem będzie 2019-06-01_17-25-36. Należy również pamiętać, że jest to czas UTC.
źródło
źródło
Używam następujących:
Lub w połączeniu z nazwą pliku dziennika „MyLogFileName”:
źródło
Jeśli PowerShell jest dostępny, możesz użyć poniższych kodów:
Oto wynik:
źródło
Jeśli nie przeszkadza Ci jednorazowa inwestycja od 10 do 30 minut w celu uzyskania niezawodnego rozwiązania (które nie zależy od ustawień regionalnych systemu Windows), czytaj dalej.
Uwolnijmy nasze umysły. Czy chcesz uprościć skrypty, aby wyglądały tak? (Załóżmy, że chcesz ustawić zmienną LOG_DATETIME)
Możesz. Po prostu zbuduj FormatNow.exe w C # .NET i dodaj go do swojej PATH.
Uwagi:
Korzyści:
Kod źródłowy programu FormatNow.exe, który zbudowałem w Visual Studio 2010 (wolę zbudować go samodzielnie, aby uniknąć ryzyka pobrania nieznanego, prawdopodobnie złośliwego programu). Po prostu skopiuj i wklej poniższe kody, skompiluj program raz, a otrzymasz niezawodny program formatujący datę do wszystkich przyszłych zastosowań.
Ogólnie rzecz biorąc, gdy mamy do czynienia ze skomplikowaną logiką, możemy to uprościć, tworząc bardzo mały program i wywołując program, aby zamiast tego przechwycić dane wyjściowe z powrotem do zmiennej skryptu wsadowego. Nie jesteśmy studentami i nie podchodzimy do egzaminów wymagających od nas przestrzegania zasady wsadowego scenariusza w celu rozwiązania problemów. W rzeczywistym środowisku pracy dozwolona jest każda (legalna) metoda. Dlaczego nadal mielibyśmy trzymać się słabych możliwości skryptu wsadowego systemu Windows, który wymaga obejścia wielu prostych zadań? Dlaczego powinniśmy używać niewłaściwego narzędzia do pracy?
źródło