Wie speichere ich das aktuelle Datum im Format JJJJ-MM-DD in einer Variablen in einer Windows-.bat-Datei?
Unix Shell analog:
today=`date +%F`
echo $today
Sie können das aktuelle Datum mit einer locale-agnostischen Methode abrufen
for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%x
Dann können Sie die einzelnen Teile mit Teilstrings extrahieren:
set today=%MyDate:~0,4%-%MyDate:~4,2%-%MyDate:~6,2%
Eine andere Möglichkeit, Variablen zu erhalten, die die einzelnen Teile enthalten, wäre:
for /f %%x in ('wmic path win32_localtime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%
Viel schöner, als mit Teilzeichen zu fummeln, auf Kosten der Verschmutzung Ihres variablen Namespaces.
Wenn Sie UTC anstelle der Ortszeit benötigen, ist der Befehl mehr oder weniger gleich:
for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do set %%x
set today=%Year%-%Month%-%Day%
Wenn Sie dies mit Standard-MS-DOS-Befehlen in einer Batchdatei erreichen möchten, können Sie Folgendes verwenden:
FOR /F "TOKENS=1 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET dd=%%A
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2,3 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET yyyy=%%C
Ich bin sicher, dass dies weiter verbessert werden kann, aber das Datum wird in 3 Variablen für Tag (Tag), Monat (mm) und Jahr (JJJJ) angegeben. Sie können diese später in Ihrem Batch-Skript nach Bedarf verwenden.
SET todaysdate=%yyyy%%mm%%dd%
echo %dd%
echo %mm%
echo %yyyy%
echo %todaysdate%
Ich verstehe, dass für diese Frage eine Antwort akzeptiert wurde. Diese alternative Methode kann von vielen geschätzt werden, die dies ohne die WMI-Konsole erreichen möchten.
Verwenden Sie date/T, um das Format in der Eingabeaufforderung zu finden.
Wenn das Datumsformat "Do 03.03.2016" lautet, verwenden Sie Folgendes:
set datestr=%date:~10,4%-%date:~7,2%-%date:~4,2%
echo %datestr%
Zwei weitere Möglichkeiten, die nicht von den Zeiteinstellungen abhängen (beide werden aus Wie erhalte ich Daten/Zeit unabhängig von der Lokalisierung). Und beide haben auch den Tag der Woche und keiner von ihnen benötigt Administratorrechte!
MAKECAB - funktioniert auf JEDEM Windows-System (schnell, erstellt jedoch eine kleine temporäre Datei) (das foxidrive-Skript):
@echo off
pushd "%temp%"
makecab /D RptFileName=~.rpt /D InfFileName=~.inf /f nul >nul
for /f "tokens=3-7" %%a in ('find /i "makecab"^<~.rpt') do (
set "current-date=%%e-%%b-%%c"
set "current-time=%%d"
set "weekday=%%a"
)
del ~.*
popd
echo %weekday% %current-date% %current-time%
pause
ROBOCOPY - Dies ist kein systemeigener Befehl für Windows XP und Windows Server 2003 , er kann jedoch von der Microsoft-Site heruntergeladen werden . Es ist jedoch in alles von Windows Vista und höher integriert:
@echo off
setlocal
for /f "skip=8 tokens=2,3,4,5,6,7,8 delims=: " %%D in ('robocopy /l * \ \ /ns /nc /ndl /nfl /np /njh /XF * /XD *') do (
set "dow=%%D"
set "month=%%E"
set "day=%%F"
set "HH=%%G"
set "MM=%%H"
set "SS=%%I"
set "year=%%J"
)
echo Day of the week: %dow%
echo Day of the month : %day%
echo Month : %month%
echo hour : %HH%
echo minutes : %MM%
echo seconds : %SS%
echo year : %year%
endlocal
Und drei weitere Möglichkeiten, die andere Windows-Skriptsprachen verwenden. Sie geben Ihnen mehr Flexibilität, z. Sie können die Woche des Jahres, die Zeit in Millisekunden usw. abrufen.
JScript/BATCH hybrid (muss als .bat
gespeichert werden). JScript ist auf jedem System von Windows NT und höher verfügbar, als Teil von Windows Script Host ( obwohl in der Registry deaktiviert werden kann, ist dies ein seltener Fall ):
@if (@X)==(@Y) @end /* ---Harmless hybrid line that begins a JScript comment
@echo off
cscript //E:JScript //nologo "%~f0"
exit /b 0
*------------------------------------------------------------------------------*/
function GetCurrentDate() {
// Today date time which will used to set as default date.
var todayDate = new Date();
todayDate = todayDate.getFullYear() + "-" +
("0" + (todayDate.getMonth() + 1)).slice(-2) + "-" +
("0" + todayDate.getDate()).slice(-2) + " " + ("0" + todayDate.getHours()).slice(-2) + ":" +
("0" + todayDate.getMinutes()).slice(-2);
return todayDate;
}
WScript.Echo(GetCurrentDate());
VBScript/BATCH hybrid ( Ist es möglich, VBScript in eine Batchdatei einzubetten und auszuführen, ohne eine temporäre Datei zu verwenden? ) Wie bei jscript, aber die Hybridisierung ist nicht so perfekt:
:sub echo(str) :end sub
echo off
'>nul 2>&1|| copy /Y %windir%\System32\doskey.exe %windir%\System32\'.exe >nul
'& echo current date:
'& cscript /nologo /E:vbscript "%~f0"
'& exit /b
'0 = vbGeneralDate - Default. Returns date: mm/dd/yy and time if specified: hh:mm:ss PM/AM.
'1 = vbLongDate - Returns date: weekday, monthname, year
'2 = vbShortDate - Returns date: mm/dd/yy
'3 = vbLongTime - Returns time: hh:mm:ss PM/AM
'4 = vbShortTime - Return time: hh:mm
WScript.echo Replace(FormatDateTime(Date, 1), ", ", "-")
PowerShell - kann auf jedem Computer installiert werden, auf dem .NET - Download von Microsoft ( v1 , v2 und v3 (nur für Windows 7 und höher)) heruntergeladen wird. Standardmäßig auf allen Windows 7/Win2008-Versionen installiert:
C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
Selbst kompiliert jscript.net/batch (Ich habe noch nie einen Windows-Computer ohne .NET gesehen, daher denke ich, dass dies ein ziemlich portables ist):
@if (@X)==(@Y) @end /****** silent line that start jscript comment ******
@echo off
::::::::::::::::::::::::::::::::::::
::: Compile the script ::::
::::::::::::::::::::::::::::::::::::
setlocal
if exist "%~n0.exe" goto :skip_compilation
set "frm=%SystemRoot%\Microsoft.NET\Framework\"
:: searching the latest installed .net framework
for /f "tokens=* delims=" %%v in ('dir /b /s /a:d /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do (
if exist "%%v\jsc.exe" (
rem :: the javascript.net compiler
set "jsc=%%~dpsnfxv\jsc.exe"
goto :break_loop
)
)
echo jsc.exe not found && exit /b 0
:break_loop
call %jsc% /nologo /out:"%~n0.exe" "%~dpsfnx0"
::::::::::::::::::::::::::::::::::::
::: End of compilation ::::
::::::::::::::::::::::::::::::::::::
:skip_compilation
"%~n0.exe"
exit /b 0
****** End of JScript comment ******/
import System;
import System.IO;
var dt=DateTime.Now;
Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss"));
Logman Das Jahr und der Wochentag können nicht abgerufen werden. Es ist vergleichsweise langsam, erstellt auch eine temporäre Datei und basiert auf den Zeitstempeln, die Logman in seine Protokolldateien schreibt. Er wird alles unter Windows XP und höher ausführen. Es wird wahrscheinlich niemals von irgendjemand benutzt - auch von mir - aber es ist eine weitere Möglichkeit ...
@echo off
setlocal
del /q /f %temp%\timestampfile_*
Logman.exe stop ts-CPU 1>nul 2>&1
Logman.exe delete ts-CPU 1>nul 2>&1
Logman.exe create counter ts-CPU -sc 2 -v mmddhhmm -max 250 -c "\Processor(_Total)\%% Processor Time" -o %temp%\timestampfile_ >nul
Logman.exe start ts-CPU 1>nul 2>&1
Logman.exe stop ts-CPU >nul 2>&1
Logman.exe delete ts-CPU >nul 2>&1
for /f "tokens=2 delims=_." %%t in ('dir /b %temp%\timestampfile_*^&del /q/f %temp%\timestampfile_*') do set timestamp=%%t
echo %timestamp%
echo MM: %timestamp:~0,2%
echo dd: %timestamp:~2,2%
echo hh: %timestamp:~4,2%
echo mm: %timestamp:~6,2%
endlocal
exit /b 0
Weitere Informationen zur Get-Date-Funktion .
Ich mochte die Methode von Joey wirklich, aber ich dachte, ich würde sie etwas erweitern.
Bei diesem Ansatz können Sie den Code mehrmals ausführen und müssen sich nicht um den alten Datumswert kümmern, da er bereits definiert ist.
Bei jeder Ausführung dieser Stapeldatei wird eine nach ISO 8601 kompatible kombinierte Darstellung von Datum und Uhrzeit ausgegeben.
FOR /F "skip=1" %%D IN ('WMIC OS GET LocalDateTime') DO (SET LIDATE=%%D & GOTO :GOT_LIDATE)
:GOT_LIDATE
SET DATETIME=%LIDATE:~0,4%-%LIDATE:~4,2%-%LIDATE:~6,2%T%LIDATE:~8,2%:%LIDATE:~10,2%:%LIDATE:~12,2%
ECHO %DATETIME%
In dieser Version müssen Sie darauf achten, nicht denselben Code an mehreren Stellen in der Datei zu kopieren/einzufügen, da dies zu doppelten Bezeichnungen führen würde. Sie können entweder für jede Kopie ein eigenes Etikett verwenden oder diesen Code einfach in eine eigene Stapeldatei einfügen und ihn bei Bedarf von Ihrer Quelldatei aus aufrufen.
Verwenden Sie einfach die Variable %date%
:
echo %date%
Ich setze eine Umgebungsvariable auf den Wert im gewünschten numerischen Format:
FOR /F "tokens=1,2,3,4 delims=/ " %a IN ('echo %date%') DO set DateRun=%d-%b-%c
Wie in der Antwort von @ProVi beschrieben, ändern Sie einfach die von Ihnen gewünschte Formatierung
echo %DATE:~10,4%-%DATE:~7,2%-%DATE:~4,2% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
wird zurückkehren
yyyy-MM-dd hh:mm:ss
2015-09-15 18:36:11
EDIT Gemäß dem @Jeb-Kommentar funktioniert das obige Zeitformat nur dann, wenn der Befehl DATE/T zurückgegeben wird
ddd dd/mm/yyyy
Thu 17/09/2015
Sie können jedoch leicht an Ihr Gebietsschema angepasst werden. Durch die Indizierung der einzelnen Zeichen in der Zeichenfolge, die von der entsprechenden Umgebungsvariable% DATE% zurückgegeben wird, können Sie die Teile der benötigten Zeichenfolge extrahieren.
z.B. Die Verwendung von% DATE ~ 10,4% würde die Umgebungsvariable DATE erweitern und dann nur die 4 Zeichen verwenden, die mit dem 11. Zeichen (Offset 10) des erweiterten Ergebnisses beginnen
Wenn Sie beispielsweise Datumsangaben im US-Stil verwenden, gilt Folgendes
ddd mm/dd/yyyy
Thu 09/17/2015
echo %DATE:~10,4%-%DATE:~4,2%-%DATE:~7,2% %TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2%
2015-09-17 18:36:11
Es ist möglich, PowerShell zu verwenden und seine Ausgabe mithilfe einer Schleife in eine Umgebungsvariable umzuleiten.
Über die Befehlszeile (cmd
):
for /f "tokens=*" %a in ('powershell get-date -format "{yyyy-mm-dd+HH:mm}"') do set td=%a
echo %td%
2016-25-02+17:25
In einer Batchdatei können Sie %a
als %%a
maskieren:
for /f "tokens=*" %%a in ('powershell get-date -format "{yyyy-mm-dd+HH:mm}"') do set td=%%a
Wenn Sie Python installiert haben, können Sie dies tun
python -c "import datetime;print(datetime.date.today().strftime('%Y-%m-%d'))"
Sie können den Formatstring problemlos an Ihre Bedürfnisse anpassen.
Aufgrund des Datums und der Uhrzeit ist das Format eine standortspezifische Information. Für das Abrufen dieser Variablen aus den Variablen% date% und% time% ist zusätzlicher Aufwand erforderlich, um die Zeichenfolge mit der Formattransformation zu analysieren. Eine gute Idee ist die Verwendung einer API, um die Datenstruktur abzurufen und nach Belieben zu analysieren. WMIC ist eine gute Wahl. Beispiel unten: Win32_LocalTime . Sie können auch Win32_CurrentTime oder Win32_UTCTime verwenden.
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
for /f %%x in ('wmic path Win32_LocalTime get /format:list ^| findstr "="') do set %%x
set yyyy=0000%Year%
set mmmm=0000%Month%
set dd=00%Day%
set hh=00%Hour%
set mm=00%Minute%
set ss=00%Second%
set ts=!yyyy:~-4!-!mmmm:~-2!-!dd:~-2!_!hh:~-2!:!mm:~-2!:!ss:~-2!
echo %ts%
ENDLOCAL
Ergebnis:
2018-04-25_10: 03: 11
Überprüfen Sie diese hier ..
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%" & set "MS=%dt:~15,3%"
set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" & set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%-%MS%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause
Dies ist eine Erweiterung von Joeys Antwort, um die Zeit einzuschließen und die Teile mit Nullen zu füllen.
Das Ergebnis ist beispielsweise 2019-06-01_17-25-36. Beachten Sie auch, dass dies die UTC-Zeit ist.
for /f %%x in ('wmic path win32_utctime get /format:list ^| findstr "="') do set %%x
set Month=0%Month%
set Month=%Month:~-2%
set Day=0%Day%
set Day=%Day:~-2%
set Hour=0%Hour%
set Hour=%Hour:~-2%
set Minute=0%Minute%
set Minute=%Minute:~-2%
set Second=0%Second%
set Second=%Second:~-2%
set TimeStamp=%Year%-%Month%-%Day%_%Hour%-%Minute%-%Second%
echo %DATE:~10,4%%DATE:~7,2%%DATE:~4,2%