it-swarm.com.de

Windows Batch: Datum in Variable formatiert

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
89
Maksym Polshcha

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%
133
Joey

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.

32
richhallstoke

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%
24
Anup Rav

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!

  1. 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
    
  2. 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.

  3. 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());
    
  4. 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), ", ", "-")
    
  5. 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}"
    
  6. 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"));
    
  7. 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 .


15
npocmaka

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.

6
aardvarkk

Verwenden Sie einfach die Variable %date%:

echo %date%
5
ProVi

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
4
Will

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
4
Mark

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
2
user103004

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.

1
CodeKid

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

1
Ivellios

Ü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
1
Bhaskara Arani

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%
0
datchung
echo %DATE:~10,4%%DATE:~7,2%%DATE:~4,2% 
0
Hillmee Bob