web-dev-qa-db-de.com

Wie erhalte ich die aktuelle Uhrzeit in der Windows-Befehlszeile in einem geeigneten Format für die Verwendung in einem Dateinamen?

Update: Jetzt, da es 2016 ist, würde ich PowerShell dafür verwenden, es sei denn, es gibt einen wirklich zwingenden abwärtskompatiblen Grund dafür, insbesondere aufgrund des Problems mit den regionalen Einstellungen bei der Verwendung von date. Siehe @ npocmaka's https://stackoverflow.com/a/19799236/8479


Mit welchen Windows-Befehlszeilenanweisungen kann ich die aktuelle Uhrzeit in einem Format abrufen, das ich in einen Dateinamen einfügen kann?

Ich möchte eine .bat-Datei haben, die ein Verzeichnis mit dem aktuellen Datum und der aktuellen Uhrzeit als Teil des Namens in ein Archiv komprimiert, z. B. Code_2008-10-14_2257.Zip. Gibt es eine einfache Möglichkeit, dies unabhängig von den regionalen Einstellungen des Geräts zu tun?

Das Datumsformat ist mir eigentlich egal, im Idealfall ist es JJJJ-MM-TT, aber alles, was einfach ist, ist in Ordnung.

Bisher habe ich das, was mir auf meinem Rechner Tue_10_14_2008_230050_91 gibt:

rem Get the datetime in a format that can go in a filename.
set _my_datetime=%date%_%time%
set _my_datetime=%_my_datetime: =_%
set _my_datetime=%_my_datetime::=%
set _my_datetime=%_my_datetime:/=_%
set _my_datetime=%_my_datetime:.=_%

rem Now use the timestamp by in a new Zip file name.
"d:\Program Files\7-Zip\7z.exe" a -r Code_%_my_datetime%.Zip Code

Ich kann damit leben, aber es scheint ein bisschen klobig. Im Idealfall wäre es kürzer und hätte das zuvor erwähnte Format.

Ich verwende Windows Server 2003 und Windows XP Professional. Ich möchte keine zusätzlichen Dienstprogramme installieren, um dies zu erreichen (obwohl ich feststelle, dass es einige gibt, die eine gute Datumsformatierung ermöglichen).

507
Rory

Informationen zum Abrufen des aktuellen Datums im MMDDYYYY-Format finden Sie unter Windows-Batchdatei (.bat):

@echo off
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
echo %mydate%_%mytime%

Wenn Sie die Uhrzeit im 24-Stunden-/Militärformat bevorzugen, können Sie die zweite FOR-Zeile durch Folgendes ersetzen:

For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b)

C:>.\Date.bat
2008-10-14_0642

Wenn Sie das Datum unabhängig von der Reihenfolge von Tag und Monat der Region wünschen, können Sie "WMIC os GET LocalDateTime" als Quelle verwenden, da es in ISO-Reihenfolge vorliegt:

@echo off
for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
set ldt=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2% %ldt:~8,2%:%ldt:~10,2%:%ldt:~12,6%
echo Local date is [%ldt%]

C:> test.cmd
Datum vor Ort ist [2012-06-19 10: 23: 47.048]

644
Jay

Regional unabhängige Analyse von Datum und Uhrzeit

Das Ausgabeformat von %DATE% und des Befehls dir ist regional abhängig und daher weder robust noch intelligent. date.exe (Teil von nxUtils ) liefert alle Datums- und Zeitinformationen in jedem denkbaren Format. Sie können die Datums-/Uhrzeitinformationen auch mit date.exe aus einer beliebigen Datei extrahieren.

Beispiele: (Verwenden Sie in einem Cmd-Skript %% anstelle von%)

date.exe +"%Y-%m-%d"
22.12.2009

date.exe +"%T"
18:55:03

date.exe +"%Y%m%d %H%M%S: Any text"
20091222 185503: Beliebiger Text

date.exe +"Text: %y/%m/%d-any text-%H.%M"
Text: 09/12/22-beliebiger Text-18.55

Command: date.exe +"%m-%d """%H %M %S """"
07-22 "18:55:03" `

Die Datums-/Uhrzeitinformationen aus einer Referenzdatei:
date.exe -r c:\file.txt +"The timestamp of file.txt is: %Y-%m-%d %H:%M:%S"

Verwenden Sie es in einem CMD-Skript, um Informationen zu Jahr, Monat, Tag und Uhrzeit abzurufen:

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

Verwenden Sie es in einem CMD-Skript, um einen Zeitstempel in einem beliebigen erforderlichen Format abzurufen:

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe +"%%y-%%m-%%d %%H:%%M:%%S"') do set timestamp=%%i

Extrahieren der Datums-/Uhrzeitinformationen aus einer Referenzdatei.

for /f "tokens=1,2,3,4,5,6* delims=," %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y,%%m,%%d,%%H,%%M,%%S"') do set yy=%%i& set mo=%%j& set dd=%%k& set hh=%%l& set mm=%%m& set ss=%%n

Hinzufügen der Datums-/Uhrzeitinformationen zu einer Datei:

for /f "tokens=*" %%i in ('C:\Tools\etc\date.exe -r file.txt +"%%y-%%m-%%d.%%H%%M%%S"') do ren file.txt file.%%i.txt

date.exe ist Teil der kostenlosen GNU Tools , die keine Installation benötigen.

HINWEIS: Das Kopieren von date.exe in ein beliebiges Verzeichnis im Suchpfad kann dazu führen, dass andere Skripts fehlschlagen, die den in Windows integrierten Befehl date verwenden.

102
Uri Liebeskind

Zwei weitere Möglichkeiten, die nicht von den Zeiteinstellungen abhängen (beide stammen aus : Wie werden Daten/Zeit unabhängig von der Lokalisierung abgerufen: ). Und beide erhalten auch den Wochentag 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
    

    Weitere Informationen zur Funktion zum Abrufen des Datums .

  2. ROBOCOPY - es ist kein nativer Befehl für Windows XP und Windows Server 2003, aber es kann von der Microsoft-Website heruntergeladen sein. Ist aber alles ab Windows Vista eingebaut:

    @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 allen Systemen ab NT als Teil von Windows Script Host ( kann jedoch in der Registrierung in seltenen Fällen deaktiviert werden ) verfügbar:

    @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. VSCRIPT/BATCH hybrid (Ist es möglich, VBScript ohne Verwendung einer temporären Datei in eine Batch-Datei einzubetten und auszuführen? Datei?) Wie 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 mit .NET installiert werden - Download von Microsoft ( v1 , v2 , v (nur für Windows 7 und höher)). Es wird standardmäßig unter allen Betriebssystemen ab Windows 7/Windows Server 2008 installiert:

    C:\> powershell get-date -format "{dd-MMM-yyyy HH:mm}"
    

    So verwenden Sie es aus einer Stapeldatei:

    for /f "delims=" %%# in ('powershell get-date -format "{dd-MMM-yyyy HH:mm}"') do @set _date=%%#
    
  6. Selbst kompiliertes jscript.net/batch (Ich habe noch nie einen Windows-Computer ohne .NET gesehen, daher denke ich, dass dies ziemlich portabel 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 Dies kann nicht das Jahr und den Tag der Woche erhalten. Es ist vergleichsweise langsam, erstellt eine temporäre Datei und basiert auf den Zeitstempeln, die Logman für seine Protokolldateien verwendet. Es funktioniert unter Windows XP und höher. Es wird wahrscheinlich niemals von irgendjemandem benutzt - auch nicht 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
    
  8. Ein weiterer Weg mit WMIC, der auch die Woche des Jahres und den Wochentag angibt, aber nicht die Millisekunden (für Millisekunden die Antwort von foxidrive prüfen) :

    for /f %%# in ('wMIC Path Win32_LocalTime Get /Format:value') do @for /f %%@ in ("%%#") do @set %%@
    echo %day%
    echo %DayOfWeek%
    echo %hour%
    echo %minute%
    echo %month%
    echo %quarter%
    echo %second%
    echo %weekinmonth%
    echo %year%
    
  9. Verwenden Sie TYPEPERF, um schnell und kompatibel mit verschiedenen Spracheinstellungen und so schnell wie möglich zu sein:

    @echo off
    setlocal
    
    :: Check if Windows is Windows XP and use Windows XP valid counter for UDP performance
    ::if defined USERDOMAIN_roamingprofile (set "v=v4") else (set "v=")
    
    for /f "tokens=4 delims=. " %%# in ('ver') do if %%# GTR 5 (set "v=v4") else ("v=")
    set "mon="
    for /f "skip=2 delims=," %%# in ('typeperf "\UDP%v%\*" -si 0 -sc 1') do (
       if not defined mon (
          for /f "tokens=1-7 delims=.:/ " %%a in (%%#) do (
            set mon=%%a
            set date=%%b
            set year=%%c
            set hour=%%d
            set minute=%%e
            set sec=%%f
            set ms=%%g
          )
       )
    )
    echo %year%.%mon%.%date%
    echo %hour%:%minute%:%sec%.%ms%
    endlocal
    
  10. MSHTA ermöglicht das Aufrufen von JavaScript-Methoden, die der in # 3 oben gezeigten JScript-Methode ähneln. Beachten Sie, dass die Date-Objekteigenschaften von JavaScript, die Monatswerte enthalten, von 0 bis 11 und nicht von 1 bis 12 nummeriert sind. Ein Wert von 9 bedeutet also Oktober.

    <!-- : Batch portion
    
    @echo off
    setlocal
    
    for /f "delims=" %%I in ('mshta "%~f0"') do set "now.%%~I"
    
    rem Display all variables beginning with "now."
    set now.
    
    goto :EOF
    
    end batch / begin HTA -->
    
    <script>
        resizeTo(0,0)
        var fso = new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1),
            now = new Date(),
            props=['getDate','getDay','getFullYear','getHours','getMilliseconds','getMinutes',
                'getMonth','getSeconds','getTime','getTimezoneOffset','getUTCDate','getUTCDay',
                'getUTCFullYear','getUTCHours','getUTCMilliseconds','getUTCMinutes','getUTCMonth',
                'getUTCSeconds','getYear','toDateString','toGMTString','toLocaleDateString',
                'toLocaleTimeString','toString','toTimeString','toUTCString','valueOf'],
            output = [];
    
        for (var i in props) {output.Push(props[i] + '()=' + now[props[i]]())}
        close(fso.Write(output.join('\n')));
    </script>
    
88
npocmaka

Hier ist eine Variante von alt.msdos.batch.nt, die lokal unabhängig arbeitet.

Fügen Sie dies in eine Textdatei ein, z. getDate.cmd

-----------8<------8<------------ snip -- snip ----------8<-------------
    :: Works on any NT/2k machine independent of regional date settings
    @ECHO off
    SETLOCAL ENABLEEXTENSIONS
    if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
    for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
      for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
        set '%%a'=%%i
        set '%%b'=%%j
        set '%%c'=%%k))
    if %'yy'% LSS 100 set 'yy'=20%'yy'%
    set Today=%'yy'%-%'mm'%-%'dd'% 
    ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%

    ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]

    :EOF
-----------8<------8<------------ snip -- snip ----------8<-------------

Um den Code ohne Fehlermeldung in stderr umzuwandeln, musste ich die einfachen Anführungszeichen um die Variablenzuweisungen für %% a, %% b und %% c hinzufügen. Mein Gebietsschema (PT) verursachte irgendwann Fehler beim Schleifen/Parsen, wenn Dinge wie "set = 20" ausgeführt wurden. Die Anführungszeichen ergeben ein Token (wenn auch leer) für die linke Seite der Zuweisungsanweisung.

Der Nachteil sind die unordentlichen Variablennamen des Gebietsschemas: 'yy', 'mm' und 'dd'. Aber hey, wen interessiert das schon!

43
vMax

Ich benutze dies (wieder nicht regionunabhängig (UK))

set bklog=%date:~6,4%-%date:~3,2%-%date:~0,2%_%time:~0,2%%time:~3,2%
34
Dale Walker

Leider ist dies nicht immun gegen regionale Einstellungen, aber es macht, was Sie wollen.

set hour=%time:~0,2%
if "%time:~0,1%"==" " set hour=0%time:~1,1%
set _my_datetime=%date:~10,4%-%date:~4,2%-%date:~7,2%_%hour%%time:~3,2%

Erstaunlich die Sachen, die Sie auf Wikipedia finden können.

24
Mark Ransom

Die ersten vier Zeilen dieses Codes geben Ihnen zuverlässige Variablen für JJ JJJJ MM HH Min Sek in Windows XP Professional und höher.

@echo off
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 "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" & set "fullstamp=%YYYY%-%MM%-%DD%_%HH%%Min%-%Sec%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
pause
19
foxidrive

Verwenden Sie das folgende Skript, um den aktuellen Tag in der Befehlszeile abzurufen:

echo %Date:~0,3%day
17
sudipto roy

Ein anderer Weg ( credit ):

@For /F "tokens=2,3,4 delims=/ " %%A in ('Date /t') do @( 
    Set Month=%%A
    Set Day=%%B
    Set Year=%%C
)

@echo DAY = %Day%
@echo Month = %Month%
@echo Year = %Year%

Beachten Sie, dass meine beiden Antworten hier immer noch von der Tages- und Monatsreihenfolge abhängig sind, die durch die regionalen Einstellungen bestimmt wird. Sie sind sich nicht sicher, wie Sie das umgehen sollen.

15
J c
"d:\Program Files\7-Zip\7z.exe" a -r code_%date:~10,4%-%date:~4,2%-%date:~7,2%.Zip
14
DigiP

Dies ist nicht wirklich kurz, könnte aber flexibler sein ( credit ):

FOR /F "TOKENS=1* DELIMS= " %%A IN ('DATE/T') DO SET CDATE=%%B
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN ('DATE/T') DO SET mm=%%B
FOR /F "TOKENS=1,2 DELIMS=/ eol=/" %%A IN ('echo %CDATE%') DO SET dd=%%B
FOR /F "TOKENS=2,3 DELIMS=/ " %%A IN ('echo %CDATE%') DO SET yyyy=%%B
SET date=%mm%%dd%%yyyy%
13
J c

So erhalten Sie die Datums- und Uhrzeitangabe in einer einzigen Zeile:

for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %a in ('%date% %time%') do echo %c-%a-%b %d%e

In den USA wird "yyyy-mm-dd hhmm" ausgegeben. Unterschiedliche regionale Einstellungen führen zu unterschiedlichen% date% -Ausgaben, Sie können jedoch die Tokenreihenfolge ändern.

Wenn Sie ein anderes Format wünschen, ändern Sie die Echo-Anweisung, indem Sie die Token neu anordnen oder andere (oder keine) Trennzeichen verwenden.

9
Matthew Johnson

Verwenden Sie einfach diese Zeile:

PowerShell -Command "get-date"
8
gdelfino

Kurze Antwort :

 :: Start - Run , type:
 cmd /c "powershell get-date -format ^"{yyyy-MM-dd HH:mm:ss}^"|clip"

 :: click into target media, Ctrl + V to paste the result 

Lange Antwort

    @echo off
    :: START USAGE  ==================================================================
    ::SET THE NICETIME 
    :: SET NICETIME=BOO
    :: CALL GetNiceTime.cmd 

    :: ECHO NICETIME IS %NICETIME%

    :: echo Nice time is %NICETIME%
    :: END USAGE  ==================================================================

    echo set hhmmsss
    :: this is Regional settings dependant so Tweak this according your current settings
    for /f "tokens=1-3 delims=:" %%a in ('echo %time%') do set hhmmsss=%%a%%b%%c 
    ::DEBUG ECHO hhmmsss IS %hhmmsss%
    ::DEBUG PAUSE
    echo %yyyymmdd%
        :: this is Regional settings dependant so Tweak this according your current settings
    for /f "tokens=1-3 delims=." %%D in ('echo %DATE%') do set  yyyymmdd=%%F%%E%%D
    ::DEBUG ECHO yyyymmdd IS %yyyymmdd%
    ::DEBUG PAUSE


    set NICETIME=%yyyymmdd%_%hhmmsss%
    ::DEBUG echo THE NICETIME IS %NICETIME%

    ::DEBUG PAUSE
8
Yordan Georgiev

Matthew Johnsons Einzeiler-Lösung um das Einzeiler-Datum und die Uhrzeit zu erhalten, ist beredt und nützlich.

Es ist jedoch eine einfache Änderung erforderlich, um in einer Batch-Datei zu arbeiten:

for /f "tokens=2,3,4,5,6 usebackq delims=:/ " %%a in ('%date% %time%') do echo %%c-%%a-%%b %%d%%e
7
John Langstaff

Und hier ist eine ähnliche Batch-Datei für den Zeitabschnitt.

:: http://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
:: Works on any NT/2k machine independent of regional time settings
::
:: Gets the time in ISO 8601 24-hour format
::
:: Note that %time% gets you fractions of seconds, and time /t doesn't, but gets you AM/PM if your locale supports that.
:: Since ISO 8601 does not care about AM/PM, we use %time%
::
    @ECHO off
    SETLOCAL ENABLEEXTENSIONS
    for /f "tokens=1-4 delims=:,.-/ " %%i in ('echo %time%') do (
      set 'hh'=%%i
      set 'mm'=%%j
      set 'ss'=%%k
      set 'ff'=%%l)
    ENDLOCAL & SET v_Hour=%'hh'%& SET v_Minute=%'mm'%& SET v_Second=%'ss'%& SET v_Fraction=%'ff'%

    ECHO Now is Hour: [%V_Hour%] Minute: [%V_Minute%] Second: [%v_Second%] Fraction: [%v_Fraction%]
    set timestring=%V_Hour%%V_Minute%%v_Second%.%v_Fraction%
    echo %timestring%

    :EOF

- Jeroen

Ich habe die Antwort mit der Batch-Datei von vMax geändert, damit es auch mit der niederländischen Sprache funktioniert.
Die Holländer haben - so hartnäckig wir auch sind - einige Änderungen am %date%, date/t und date vorgenommen, die die ursprüngliche Batch-Datei beschädigen.

Es wäre schön, wenn einige Leute dies auch mit anderen Windows-Gebietsschemas vergleichen und die Ergebnisse zurückmelden könnten.
Wenn die Batch-Datei an Ihrem Speicherort fehlschlägt, fügen Sie bitte die Ausgabe dieser beiden Anweisungen in den Befehl Eingabeaufforderung ein:
echo:^|date
date/t

Dies ist ein Beispiel für die Ausgabe, die Sie aus der Batch-Datei erhalten sollten:

C:\temp>set-date-cmd.bat
Today is Year: [2011] Month: [01] Day: [03]
20110103

Hier ist der überarbeitete Code mit Kommentaren zum Warum:

:: https://stackoverflow.com/questions/203090/how-to-get-current-datetime-on-windows-command-line-in-a-suitable-format-for-usi
:: Works on any NT/2k machine independent of regional date settings
::
:: 20110103 - adapted by [email protected] for Dutch locale
:: Dutch will get jj as year from echo:^|date, so the '%%c' trick does not work as it will fill 'jj', but we want 'yy'
:: luckily, all countries seem to have year at the end: http://en.wikipedia.org/wiki/Calendar_date
::            set '%%c'=%%k
::            set 'yy'=%%k
::
:: In addition, date will display the current date before the input Prompt using dashes
:: in Dutch, but using slashes in English, so there will be two occurances of the outer loop in Dutch
:: and one occurence in English.
:: This skips the first iteration:
::        if "%%a" GEQ "A"
::
:: echo:^|date
:: Huidige datum: ma 03-01-2011
:: Voer de nieuwe datum in: (dd-mm-jj)
:: The current date is: Mon 01/03/2011
:: Enter the new date: (mm-dd-yy)
::
:: date/t
:: ma 03-01-2011
:: Mon 01/03/2011
::
:: The assumption in this batch-file is that echo:^|date will return the date format
:: using either mm and dd or dd and mm in the first two valid tokens on the second line, and the year as the last token.
::
:: The outer loop will get the right tokens, the inner loop assigns the variables depending on the tokens.
:: That will resolve the order of the tokens.
::
@ECHO off
    set v_day=
    set v_month=
    set v_year=

    SETLOCAL ENABLEEXTENSIONS
    if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
::DEBUG echo toks=%toks%
      for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
::DEBUG echo first token=%%a
        if "%%a" GEQ "A" (
          for /f "tokens=%toks% delims=.-/ " %%i in ('date/t') do (
            set '%%a'=%%i
            set '%%b'=%%j
            set 'yy'=%%k
          )
        )
      )
      if %'yy'% LSS 100 set 'yy'=20%'yy'%
      set Today=%'yy'%-%'mm'%-%'dd'%

    ENDLOCAL & SET v_year=%'yy'%& SET v_month=%'mm'%& SET v_day=%'dd'%

    ECHO Today is Year: [%V_Year%] Month: [%V_Month%] Day: [%V_Day%]
    set datestring=%V_Year%%V_Month%%V_Day%
    echo %datestring%

    :EOF

- Jeroen

Eine Funktion, die auf wmic basiert:

:Now  -- Gets the current date and time into separate variables
::    %~1: [out] Year
::    %~2: [out] Month
::    %~3: [out] Day
::    %~4: [out] Hour
::    %~5: [out] Minute
::    %~6: [out] Second
  setlocal
  for /f %%t in ('wmic os get LocalDateTime ^| findstr /b [0-9]') do set T=%%t
  endlocal & (
    if "%~1" neq "" set %~1=%T:~0,4%
    if "%~2" neq "" set %~2=%T:~4,2%
    if "%~3" neq "" set %~3=%T:~6,2%
    if "%~4" neq "" set %~4=%T:~8,2%
    if "%~5" neq "" set %~5=%T:~10,2%
    if "%~6" neq "" set %~6=%T:~12,2%
  )
goto:eof

pside: Region unabhängig. Downside: Nur Systemadministratoren können wmic.exe ausführen.

Verwendungszweck:

call:Now Y M D H N S
echo %Y%-%M%-%D% %H%:%N%:%S%

Dies gibt eine Zeichenfolge wie die folgende wieder:

2014-01-22 12:51:53

Beachten Sie, dass Funktionsparameter Out-Parameter sind. Sie müssen also Variablennamen anstelle von Werten angeben.

Alle Parameter sind optional, daher ist call:Now Y M ein gültiger Aufruf, wenn Sie nur Jahr und Monat abrufen möchten.

6
Tomalak

Ich hatte ein ähnliches Problem. Ich lade täglich eine verschlüsselte Datei automatisch von einem FTP-Server herunter. Ich wollte die Datei mit gpg entschlüsseln, die Datei in das aktuelle Datum umbenennen (JJJJMMTT-Format) und die entschlüsselte Datei in einen Ordner für die richtige Abteilung ablegen.

Ich habe mehrere Vorschläge zum Umbenennen der Datei nach Datum durchgearbeitet und hatte kein Glück, bis ich auf diese einfache Lösung gestoßen bin.

for /f "tokens=1-5 delims=/ " %%d in ("%date%") do rename "decrypted.txt" %%g-%%e-%%f.txt

Es hat perfekt funktioniert (d. H. Der Dateiname lautet "2011-06-14.txt").

(Quelle)

5
KChiki

Das habe ich benutzt:

::Date Variables - replace characters that are not legal as part of filesystem file names (to produce name like "backup_04.15.08.7z")
SET DT=%date%
SET DT=%DT:/=.%
SET DT=%DT:-=.%

Wenn Sie weitere Ideen für die Automatisierung von Sicherungen in 7-Zip-Archiven wünschen, habe ich ein freies/offenes Projekt, das Sie verwenden oder auf Ideen prüfen können: http://wittman.org/ziparcy/

5
micahwittman

http://sourceforge.net/projects/unxutils/files/

Suchen Sie in der Zip-Datei nach "Date.exe" und benennen Sie sie in "DateFormat.exe" um (um Konflikte zu vermeiden).

Legen Sie es in Ihrem Windows-System32-Ordner.

Es hat viele "Datumsausgabe" -Optionen.

Verwenden Sie DateFormat.exe --h, um Hilfe zu erhalten.

Ich bin nicht sicher, wie Sie seine Ausgabe in eine Umgebungsvariable setzen würden ... mit SET.

4
Sally

Regionale unabhängige Lösung zur Generierung des ISO-Datumsformats:

rem save the existing format definition
for /f "skip=2 tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate') do set FORMAT=%%a
rem set ISO specific format definition
reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d yyyy-MM-dd 1>nul:
rem query the date in the ISO specific format 
set ISODATE=%DATE%
rem restore previous format definition
reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /f /d %FORMAT% 1>nul:

Was könnte noch optimiert werden: Andere Prozesse können verwirrt sein, wenn das Datumsformat in der kurzen Zeit verwendet wird, während es geändert wird. Das Parsen der Ausgabe gemäß der vorhandenen Formatzeichenfolge könnte daher sicherer sein, wird jedoch komplizierter

3
V15I0N
:: GetDate.cmd -> Uses WMIC.exe to get current date and time in ISO 8601 format
:: - Sets environment variables %_isotime% and %_now% to current time
:: - On failure, clears these environment variables
:: Inspired on -> https://ss64.com/nt/syntax-getdate.html
:: - (cX) 2017 [email protected]
:: - http://stackoverflow.com/questions/203090
@echo off

set _isotime=
set _now=

:: Check that WMIC.exe is available
WMIC.exe Alias /? >NUL 2>&1 || goto _WMIC_MISSING_

if not (%1)==() goto _help
SetLocal EnableDelayedExpansion

:: Use WMIC.exe to retrieve date and time
FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC.exe Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
    IF "%%~L"=="" goto  _WMIC_done_
        set _yyyy=%%L
        set _mm=00%%J
        set _dd=00%%G
        set _hour=00%%H
        set _minute=00%%I
        set _second=00%%K
)
:_WMIC_done_

::   1    2     3       4      5      6
:: %%G  %%H    %%I     %%J    %%K    %%L
:: Day  Hour  Minute  Month  Second  Year
:: 27   9     35      4      38      2017

:: Remove excess leading zeroes
        set _mm=%_mm:~-2%
        set _dd=%_dd:~-2%
        set _hour=%_hour:~-2%
        set _minute=%_minute:~-2%
        set _second=%_second:~-2%
:: Syntax -> %variable:~num_chars_to_skip,num_chars_to_keep%

:: Set date/time in ISO 8601 format:
        Set _isotime=%_yyyy%-%_mm%-%_dd%T%_hour%:%_minute%:%_second%
:: -> http://google.com/search?num=100&q=ISO+8601+format

if 1%_hour% LSS 112 set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%am
if 1%_hour% LSS 112 goto _skip_12_
    set /a _hour=1%_hour%-12
    set _hour=%_hour:~-2%
    set _now=%_isotime:~0,10% %_hour%:%_minute%:%_second%pm
    :: -> https://ss64.com/nt/if.html
    :: -> http://google.com/search?num=100&q=SetLocal+EndLocal+Windows
    :: 'if () else ()' will NOT set %_now% correctly !?
:_skip_12_

EndLocal & set _isotime=%_isotime% & set _now=%_now%
goto _out

:_WMIC_MISSING_
echo.
echo WMIC.exe command not available
echo - WMIC.exe needs Administrator privileges to run in Windows
echo - Usually the path to WMIC.exe is "%windir%\System32\wbem\WMIC.exe"

:_help
echo.
echo GetDate.cmd: Uses WMIC.exe to get current date and time in ISO 8601 format
echo.
echo    %%_now%%     environment variable set to current date and time
echo    %%_isotime%% environment variable to current time in ISO format
echo    set _today=%%_isotime:~0,10%%
echo.

:_out
:: EOF: GetDate.cmd
2
Adolfo

Bei bekannter Lokalität als Referenz in funktionaler Form. Der Aufruf ECHOTIMESTAMP zeigt, wie der Zeitstempel in eine Variable eingefügt wird (DTS in diesem Beispiel).

@ECHO off

CALL :ECHOTIMESTAMP
GOTO END

:TIMESTAMP
SETLOCAL  EnableDelayedExpansion
    SET DATESTAMP=!DATE:~10,4!-!DATE:~4,2!-!DATE:~7,2!
    SET TIMESTAMP=!TIME:~0,2!-!TIME:~3,2!-!TIME:~6,2!
    SET DTS=!DATESTAMP: =0!-!TIMESTAMP: =0!
ENDLOCAL & SET "%~1=%DTS%"
GOTO :EOF

:ECHOTIMESTAMP
SETLOCAL
    CALL :TIMESTAMP DTS
    ECHO %DTS%
ENDLOCAL
GOTO :EOF

:END

EXIT /b 0

Und in der Datei timestamp.bat gespeichert, hier ist die Ausgabe:

enter image description here

0
bvj

Unter Windows 7 funktioniert dieser Code für mich:

SET DATE=%date%
SET YEAR=%DATE:~0,4%
SET MONTH=%DATE:~5,2%
SET DAY=%DATE:~8,2%
ECHO %YEAR%
ECHO %MONTH%
ECHO %DAY%

SET DATE_FRM=%YEAR%-%MONTH%-%DAY% 
ECHO %DATE_FRM%
0
Frizz1977

Ich bevorzuge es so kurz wie möglich zu machen, also ohne Monat und Jahr ist genug für die tägliche Aktualisierung

SET date=%DATE:~0,2%
SET hour=%TIME:~0,2%
SET minute=%TIME:~3,2%
IF "%date:~0,1%"==" " SET date=0%DATE:~1,1%
IF "%hour:~0,1%"==" " SET hour=0%TIME:~1,1%
IF "%minute:~0,1%"==" " SET minute=0%TIME:~1,1%
SET VERSION=%date%%hour%%minute%
ECHO VERSION=%date%%hour%%minute%
VERSION=140105

Wenn es um die Version einer Anwendung geht, stellen Sie diese mit einem Builder auf den neuesten Stand

steps:
- name: "gcr.io/cloud-builders/gcloud"
  args: ["app", "deploy", '--version=v1-140105-fresh']
timeout: "300s"

Dadurch wird es einfacher, die gesamte Anwendung automatisch zu aktualisieren

sed -e "s/-[0-9]\{1,\}-fresh/-%VERSION%-local/g" cloudbuild.yaml > tmp.txt 
mv -f tmp.txt cloudbuild.yaml

Die Ausgabedatei kann lokal aktualisiert werden, ohne die Dateinamen zu berühren

steps:
- name: "gcr.io/cloud-builders/gcloud"
  args: ["app", "deploy", '--version=v1-140117-local']
timeout: "300s"
0
Chetabahana