it-swarm.com.de

Datum und Uhrzeit in einem Windows-Stapelskript formatieren

In einem Windows-Batch-Skript (Windows XP) muss das aktuelle Datum und die Uhrzeit für die spätere Verwendung in Dateinamen usw. formatiert werden.

Es ist vergleichbar mit Stack Overflow question Wie man ein Datum in Batchdateien anfügt, aber auch mit der Zeit.

Ich habe das bisher:

echo %DATE%
echo %TIME%
set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
echo %datetimef%

was gibt:

28/07/2009
 8:35:31.01
2009_07_28__ 8_36_01

Gibt es eine Möglichkeit, eine einstellige Stunde in% TIME% zuzulassen, damit ich Folgendes erhalten kann?

2009_07_28__08_36_01
167
laurie

Ich endete mit diesem Skript:

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
echo hour=%hour%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
echo min=%min%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
echo secs=%secs%

set year=%date:~-4%
echo year=%year%

:: Auf WIN2008R2 z. Ich musste Ihren 'set month =% date: ~ 3,2%' wie folgt einstellen: ansonsten erscheint 00 für MONAT

set month=%date:~4,2%
if "%month:~0,1%" == " " set month=0%month:~1,1%
echo month=%month%
set day=%date:~0,2%
if "%day:~0,1%" == " " set day=0%day:~1,1%
echo day=%day%

set datetimef=%year%%month%%day%_%hour%%min%%secs%

echo datetimef=%datetimef%
136
laurie
@ECHO OFF
: Sets the proper date and time stamp with 24Hr Time for log file naming
: convention

SET HOUR=%time:~0,2%
SET dtStamp9=%date:~-4%%date:~4,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% 
SET dtStamp24=%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%

if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)

ECHO %dtStamp%

PAUSE
65
The lorax

So generiere ich einen Protokolldateinamen (basierend auf http://ss64.com/nt/syntax-getdate.html ):

@ECHO OFF
:: Check WMIC is available
WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error

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

:: Pad digits with leading zeros
      Set _mm=%_mm:~-2%
      Set _dd=%_dd:~-2%
      Set _hour=%_hour:~-2%
      Set _minute=%_minute:~-2%
      Set _second=%_second:~-2%

Set logtimestamp=%_yyyy%-%_mm%-%_dd%_%_hour%_%_minute%_%_second%
goto make_dump

:s_error
echo WMIC is not available, using default log filename
Set logtimestamp=_

:make_dump
set FILENAME=database_dump_%logtimestamp%.sql
...
56
nightcoder

Wenn PowerShell installiert ist, können Sie Datum und Uhrzeit in jedem gewünschten Format einfach und zuverlässig abrufen. Beispiel:

for /f %%a in ('powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%%a
move "%oldfile%" "backup-%datetime%"

Natürlich wird heutzutage PowerShell immer installiert, aber unter Windows XP möchten Sie diese Technik wahrscheinlich nur verwenden, wenn Ihr Batch-Skript in einer bekannten Umgebung verwendet wird, in der Sie wissen, dass PS verfügbar ist (oder Ihre Batch-Datei einchecken) wenn PowerShell verfügbar ist ...)

Sie können sich einigermaßen fragen: Warum sollten Sie überhaupt eine Batch-Datei verwenden, wenn Sie mit PowerShell Datum und Uhrzeit abrufen können, aber ich denke, es gibt einige offensichtliche Gründe dafür: (a) Sie sind nicht mit PowerShell vertraut und bevorzugen es trotzdem Dinge auf altmodische Weise mit Batch-Dateien oder (b) Sie aktualisieren ein altes Skript und möchten das Ganze nicht auf PS portieren. 

34
G. Lombard

Ich mache es normalerweise auf diese Weise, wenn ich eine Datums-/Zeitzeichenfolge benötige:

set dt=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%__%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2%
set dt=%dt: =0%

Dies ist für das deutsche Datums-/Zeitformat (TT.MM.JJJJ hh: mm: ss). Grundsätzlich verkette ich die Teilzeichenketten und ersetze schließlich alle Leerzeichen durch Nullen.

Kurze Erklärung der Funktionsweise von Teilstrings:

%VARIABLE:~num_chars_to_skip,num_chars_to_keep%

Um also nur das Jahr von einem Datum wie "29.03.2018" zu verwenden:

%DATE:~6,4%
       ^-----skip 6 characters
         ^---keep 4 characters 
31
mrt

Ich bin heute auf dieses Problem gestoßen und habe es gelöst mit:

SET LOGTIME=%TIME: =0%

Es ersetzt Leerzeichen durch Nullen und setzt die Stunde im Grunde auf Null.

Nach einer kurzen Suche habe ich nicht herausgefunden, ob es Befehlserweiterungen erfordert (funktionierte trotzdem mit SETLOCAL DISABLEEXTENSIONS).

27
opello

Wie bereits erwähnt, ist das Parsen von Datum und Uhrzeit nur nützlich, wenn Sie das vom aktuellen Benutzer verwendete Format kennen (z. B. MM/TT/JJ oder TT-MM-JJJJ, um nur zwei zu nennen). Dies könnte bestimmt werden, aber wenn Sie all das Stress und Parsen erledigen, werden Sie immer noch mit einer Situation konfrontiert sein, in der ein unerwartetes Format verwendet wird und weitere Anpassungen erforderlich sein werden.

Sie können auch ein externes Programm verwenden, das ein Datumsfenster in Ihrem bevorzugten Format zurückgibt. Dies hat jedoch den Nachteil, dass Sie das Dienstprogramm mit Ihrem Skript/Stapel verteilen müssen.

Es gibt auch Batch-Tricks, die die CMOS - Uhr auf eine ziemlich rohe Art und Weise verwenden, aber das ist für die meisten Leute zu nah an den blanken Drähten und auch nicht immer der bevorzugte Ort, um Datum und Uhrzeit abzurufen.

Nachfolgend finden Sie eine Lösung, die die oben genannten Probleme vermeidet. Ja, es führt einige andere Probleme ein, aber für meine Zwecke habe ich festgestellt, dass dies die einfachste, übersichtlichste und tragbarste Lösung zum Erstellen eines Datumsstempels in .bat-Dateien für moderne Windows-Systeme ist. Dies ist nur ein Beispiel, aber ich denke, Sie werden sehen, wie Sie andere Datums- und/oder Uhrzeitformate usw. ändern können.

reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f
reg add "HKCU\Control Panel\International" /v sShortDate /d "yyMMdd" /f
@REM reg query "HKCU\Control Panel\International" /v sShortDate
set LogDate=%date%
reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f
20
jph

Das Folgende kann keine direkte Antwort sein, sondern eine nahe Antwort?

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__0%time:~1,2%_%time:~3,2%_%time:~6,2%
else set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%

Zumindest mag es inspirierend sein.

9
ufukgun

Wenn Sie dieses Format nicht genau benötigen:

2009_07_28__08_36_01

Dann könnten Sie die folgenden 3 Codezeilen verwenden die% date% und% time% verwenden:

set mydate=%date:/=%
set mytime=%time::=%
set mytimestamp=%mydate: =_%_%mytime:.=_%

Hinweis: Die Zeichen / und : werden entfernt und die Zeichen . und Leerzeichen werden durch einen Unterstrich ersetzt.

Beispielausgabe (Mittwoch, 08.05.15 um 12:49 Uhr PM mit 50 Sekunden und 93 Millisekunden):

echo %mytimestamp%
Wed_08052015_124950_93
8
Jesse
REM Assumes UK style date format for date environment variable (DD/MM/YYYY).
REM Assumes times before 10:00:00 (10am) displayed padded with a space instead of a zero.
REM If first character of time is a space (less than 1) then set DATETIME to:
REM YYYY-MM-DD-0h-mm-ss
REM Otherwise, set DATETIME to:
REM YYYY-MM-DD-HH-mm-ss
REM Year, month, day format provides better filename sorting (otherwise, days grouped
REM together when sorted alphabetically).

IF "%time:~0,1%" LSS "1" (
   SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-0%time:~1,1%-%time:~3,2%-%time:~6,2%
) ELSE (
   SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%
)

ECHO %DATETIME%
6
Mike Raynham

Die offset:length-Formatierung, die mit dem Befehl SET in Windows unterstützt wird, ermöglicht es Ihnen nicht, den 0 aufzufüllen, an dem Sie interessiert sind.

Sie können jedoch ein BATCH-Skript so programmieren, dass nach der Stunde gesucht wird, die kleiner ist als 10 und
Füllen Sie entsprechend mit einer anderen echo-Zeichenfolge auf.

Auf dem Link SET finden Sie einige Informationen über diesen Link


Sie können auch zu anderen Programmiermethoden wechseln, um hierher zu gelangen. 

Es ist ziemlich einfach in Unix-Bash (verfügbar mit Cygwin unter Windows), um einfach zu sagen:

date +%Y_%m_%d__%H_%M_%S

Und es füllt immer richtig.

6
nik

Ich habe es so gemacht:

REM Generate FileName from date and time in format YYYYMMTTHHMM

Time /T > Time.dat
set /P ftime= < Time.dat

set FileName=LogFile%date:~6%%date:~3,2%%date:~0,2%%ftime:~0,2%%ftime:~3,2%.log

echo %FileName%

LogFile201310170928.log

5
Ice
::========================================================================  
::== CREATE UNIQUE DATETIME STRING IN FORMAT YYYYMMDD-HHMMSS   
::======= ================================================================  
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a  
SET DATETIME=%DTS:~0,8%-%DTS:~8,6%  



4
Kees

Um einen YYYY-MM-DD hh:mm:ss (24-Stunden) -Zeitstempel zu generieren, verwende ich:

SET CURRENTTIME=%TIME%
IF "%CURRENTTIME:~0,1%"==" " (SET CURRENTTIME=0%CURRENTTIME:~1%)
FOR /F "tokens=2-4 delims=/ " %%A IN ('DATE /T') DO (SET TIMESTAMP=%%C-%%A-%%B %CURRENTTIME%)
3
M. Dudley

Ich bin wirklich neu für Batch-Dateien und das ist mein Code !! (Ich bin nicht sicher warum, aber ich konnte date/t und time/t nicht miteinander kombinieren und ich konnte% date% und% time% nicht verwenden. direkt ohne Variable ...)

@ECHO OFF
set ldt=%date% %time%
echo %ldt%>> logs.txt
EXIT

Es wird von anderen wiederverwendet (die Frage war, einen formatierten Zeitpunkt als Dateinamen zu verwenden).

3
Kelly
set hourstr = %time:~0,2%
if "%time:~0,1%"==" " (set hourstr=0%time:~1,1%)
set datetimestr=%date:~0,4%%date:~5,2%%date:~8,2%-%hourstr%%time:~3,2%%time:~6,2%
2
Will Wu

Dieses Batch-Skript macht genau das, was der O.P. will (getestet unter Windows XP SP3). 

Ich habe auch den durch "jph" beschriebenen intelligenten Registry-Trick verwendet, dessen IMHO der einfachste Weg ist, eine 100% konsistente Formatierung des Datums in "yyyy_MM_dd" auf einem neuen oder alten Windows-System zu erhalten. Die Änderung zu einem Registrierungswert dafür ist sofort temporär und trivial; es dauert nur wenige Millisekunden, bevor es sofort zurückgesetzt wird.

Doppelklicken Sie auf diese Batchdatei, um eine sofortige Demo zu erhalten. Das Eingabeaufforderungsfenster wird geöffnet und zeigt Ihren Zeitstempel an. . . . .

@ECHO OFF
SETLOCAL & MODE CON:COLS=80 LINES=15 & COLOR 0A
TITLE GENERATE A CUSTOM FORMATTED TIMESTAMP USING %%DATE%% AND %%TIME%% COMMANDS

:: --- CHANGE THE COMPUTER DATE FORMAT TEMPORARILY TO MY PREFERENCE "yyyy_MM_dd",
REG COPY "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f 2>nul >nul
REG ADD "HKCU\Control Panel\International" /v sShortDate /d "yyyy_MM_dd" /f 2>nul >nul
SET MYDATE=%date%
:: --- REVERT COMPUTER DATE BACK TO SYSTEM PREFERENCE
REG COPY "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f 2>nul >nul
REG DELETE "HKCU\Control Panel\International-Temp" /f 2>nul >nul

:: --- SPLIT THE TIME DIGITS TO THREE BLOCKS [H] [MM] [SS.SS]
FOR /F "tokens=1-3 delims=:" %%A IN ('echo %time%') DO SET HOUR=%%A& SET MINUTES=%%B& SET SECONDS=%%C

:: --- YOUR CHOICE - FOR 4 DIGIT SECONDS - REMOVES THE DOT FROM THE SECONDS BLOCK [SS.SS]
:: SET SECONDS=%SECONDS:.=%
:: --- YOUR CHOICE - FOR 2 DIGIT SECONDS - GETS THE FIRST TWO DIGITS FROM THE SECONDS BLOCK [SS.SS]
SET SECONDS=%SECONDS:~0,2%

:: --- GET THE "AM PM" STRING TO CHECK THE HOUR BLOCK
FOR /F "tokens=1,2 delims= " %%A IN ('time /t') DO SET AM_PM=%%B  

:: --- CONVERT THE HOUR BLOCK [H] TO "24 HOUR" FORMAT [HH]
IF %AM_PM%==PM (
IF %HOUR%==01 (SET HOUR=13)
IF %HOUR%==02 (SET HOUR=14)
IF %HOUR%==03 (SET HOUR=15)
IF %HOUR%==04 (SET HOUR=16)
IF %HOUR%==05 (SET HOUR=17)
IF %HOUR%==06 (SET HOUR=18)
IF %HOUR%==07 (SET HOUR=19)
IF %HOUR%==08 (SET HOUR=20)
IF %HOUR%==09 (SET HOUR=21)
IF %HOUR%==10 (SET HOUR=22)
IF %HOUR%==11 (SET HOUR=23)
) ELSE (
IF %HOUR%==12 (SET HOUR=00)
IF %HOUR%==1 (SET HOUR=01)
IF %HOUR%==2 (SET HOUR=02)
IF %HOUR%==3 (SET HOUR=03)
IF %HOUR%==4 (SET HOUR=04)
IF %HOUR%==5 (SET HOUR=05)
IF %HOUR%==6 (SET HOUR=06)
IF %HOUR%==7 (SET HOUR=07)
IF %HOUR%==8 (SET HOUR=08)
IF %HOUR%==9 (SET HOUR=09)
)

:: --- GENERATE OUR WANTED TIMESTAMP
ECHO. & ECHO.
SET TIMESTAMP=%MYDATE%__%HOUR%_%MINUTES%_%SECONDS%
ECHO    Your timestamp is:    %TIMESTAMP%

:: --- WAIT - VIEW THE RESULT IN THE CONSOLE SCREEN
ECHO. & ECHO.
ECHO    Job is done. Press any key to exit . . .
PAUSE > NUL

EXIT
2
derty2

Diese bat-Datei (als datetimestr.bat speichern) erzeugt dreimal den datetime-String: (1) langer datetime-String mit Wochentag und Sekunden, (2) kurzer datetime-String ohne sie und (3) kurze Version des Codes.

@echo off
REM "%date: =0%" replaces spaces with zeros
set d=%date: =0%
REM "set yyyy=%d:~-4%" pulls the last 4 characters
set yyyy=%d:~-4%
set mm=%d:~4,2%
set dd=%d:~7,2%
set dow=%d:~0,3%
set d=%yyyy%-%mm%-%dd%_%dow%

set t=%TIME: =0%
REM "%t::=%" removes semi-colons
REM Instead of above, you could use "%t::=-%" to 
REM replace semi-colons with hyphens (or any 
REM non-special character)
set t=%t::=%
set t=%t:.=%

set datetimestr=%d%_%t%
@echo  Long date time str = %datetimestr%

set d=%d:~0,10%
set t=%t:~0,4%
set datetimestr=%d%_%t%
@echo Short date time str = %datetimestr%


@REM Short version of the code above
set d=%date: =0%
set t=%TIME: =0%
set datetimestr=%d:~-4%-%d:~4,2%-%d:~7,2%_%d:~0,3%_%t:~0,2%%t:~3,2%%t:~6,2%%t:~9,2%
@echo Datetimestr = %datetimestr%

pause

Um das zu würdigen, habe ich die Konzepte von Peter Mortensen (18. Juni 14 um 21:02 Uhr) und Opello (25. August 11 um 14:27 Uhr) zusammengeführt. 

Sie können dies viel kürzer schreiben, aber diese lange Version macht das Lesen und Verstehen des Codes einfach. 

2
cadvena

Erstellen Sie eine Datei mit dem Namen "search_files.bat" und fügen Sie den Inhalt darunter in die Datei ein. Dann doppelklicken Sie darauf. Die temporäre Variable% THH% wurde eingerichtet, um den AM entsprechend zu behandeln. Wenn die ersten beiden Ziffern der Zeit eine 0 enthalten, ignoriert Windows den Rest des Dateinamens der LOG-Datei.

CD .
SET THH=%time:~0,2%
SET THH=%THH: =0%
dir /s /b *.* > %date:~10,4%-%date:~4,2%-%date:~7,2%@%THH%.%time:~3,2%.%time:~6,2%.LOG
2
MacGyver

Ich mag die kurze Version über @The lorax, Aber für andere Spracheinstellungen kann es etwas anders sein. 

In deutschen Spracheinstellungen (mit natürlichem Datumsformat: dd.mm.yyyy) muss beispielsweise die Monatsabfrage von 4,2 auf 3,2 geändert werden:

@ECHO OFF
: Sets the proper date and time stamp with 24h time for log file naming convention i.e.

SET HOUR=%time:~0,2%
SET dtStamp9=%date:~-4%%date:~3,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% 
SET dtStamp24=%date:~-4%%date:~3,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%

if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%)

ECHO %dtStamp%
: Outputs= 20160727_081040
: (format: YYYYMMDD_HHmmss; e.g.: the date-output of this post timestamp)

PAUSE
2
webMac

Es gibt einen anderen einfachen Weg, dies zu tun:

set HH=%time:~0,2%
if %HH% LEQ 9 (
set HH=%time:~1,1%
)
1
vijay

Verwenden Sie in solchen Situationen eine einfache, standardisierte Programmierungsmethode: Anstatt einen großen Aufwand beim Analysieren einer unbekannten Entität aufzuwenden, speichern Sie einfach die aktuelle Konfiguration, setzen Sie sie in einen bekannten Zustand zurück, extrahieren Sie die Informationen und stellen Sie dann den ursprünglichen Zustand wieder her. Verwenden Sie nur Windows-Standardressourcen.

Insbesondere werden Datums- und Uhrzeitformate unter dem Registrierungsschlüssel HKCU\Control Panel\International\in [MS-Definition] "values": "sTimeFormat" und "sShortDate" gespeichert. Reg ist der in allen Windows-Versionen enthaltene Konsolenregistrierungseditor . Zum Ändern des HKCU-Schlüssels sind keine erhöhten Berechtigungen erforderlich

Prompt $N:$D $T$G

::Save current config to a temporary (unique name) subkey, Exit if copy fails
Set DateTime=
Set ran=%Random%
Reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp%ran%" /f
If ErrorLevel 1 GoTO :EOF

::Reset the date format to your desired output format (take effect immediately)
::Resetting the time format is useless as it only affect subsequent console windows
::Reg add "HKCU\Control Panel\International" /v sTimeFormat /d "HH_mm_ss"   /f
Reg add "HKCU\Control Panel\International" /v sShortDate  /d "yyyy_MM_dd" /f

::Concatenate the time and (reformatted) date strings, replace any embedded blanks with zeros
Set DateTime=%date%__%time:~0,2%_%time:~3,2%_%time:~6,2%
Set DateTime=%DateTime: =0%

::Restore the original config and delete the temp subkey, Exit if restore fails
Reg copy   "HKCU\Control Panel\International-Temp%ran%" "HKCU\Control Panel\International" /f
If ErrorLevel 1 GoTO :EOF
Reg delete "HKCU\Control Panel\International-Temp%ran%" /f

Einfach, unkompliziert und sollte für alle Regionen funktionieren.

Aus Gründen, die ich nicht verstehe, wird das Zurücksetzen des "sShortDate" -Werts sofort in Eines Konsolenfensters wirksam, aber das Zurücksetzen des sehr ähnlichen "sTimeFormat" -Wertes wirktNICHT, bis eine neue Konsole wirksam wird Fenster wird geöffnet. Die einzige Sache, die geändert werden kann, ist das Trennzeichen - Die Ziffernpositionen sind festgelegt. Gleichermaßen soll das Zeitzeichen "HH" führende Nullen voranstellen, jedoch nicht. Zum Glück sind die Problemumgehungen einfach.

1
ArtK

Ich habe die akzeptierte Antwort ausprobiert und sie funktioniert ziemlich gut. Leider scheint das US-Zeitformat H: MM: SS.CS zu sein, und die fehlende 0 an der Vorderseite führte vor 10 Uhr zu Problemen beim Analysieren. Um diese Hürde zu überwinden und auch das Analysieren der meisten Weltzeitformate zuzulassen, habe ich mir diese einfache Routine ausgedacht, die recht gut zu funktionieren scheint.

:ParseTime
rem The format of %%TIME%% is H:MM:SS.CS or (HH:MM:SS,CS) for example 0:01:23.45 or 23:59:59,99
FOR /F "tokens=1,2,3,4 delims=:.," %%a IN ("%1") DO SET /A "%2=(%%a * 360000) + (%%b * 6000) + (%%c * 100) + %%d"
GOTO :EOF

Das Schöne an dieser Routine ist, dass Sie die Zeitzeichenfolge als ersten Parameter und den Namen der Umgebungsvariablen übergeben, in der Sie die Zeit (in Zentisekunden) als zweiten Parameter angeben möchten. Zum Beispiel:

CALL :ParseTime %START_TIME% START_CS
CALL :ParseTime %TIME% END_CS
SET /A DURATION=%END_CS% - %START_CS%

(* Chris *)

1
TheChrisPratt

Vielleicht so etwas:

@call:DateTime

@for %%? in (
    "Year   :Y"
    "Month  :M"
    "Day    :D"
    "Hour   :H"
    "Minutes:I"
    "Seconds:S"
) do @for /f "tokens=1-2 delims=:" %%# in (%%?) do @for /f "delims=" %%_ in ('echo %%_DT_%%$_%%') do @echo %%# : _DT_%%$_ : %%_

:: OUTPUT
:: Year    : _DT_Y_ : 2014
:: Month   : _DT_M_ : 12
:: Day     : _DT_D_ : 17
:: Hour    : _DT_H_ : 09
:: Minutes : _DT_I_ : 04
:: Seconds : _DT_S_ : 35

@pause>nul

@goto:eof

:DateTime
    @verify errorlevel 2>nul & @wmics Alias /? >nul 2>&1
    @if not errorlevel 1 (
        @for /f "skip=1 tokens=1-6" %%a in ('wmic path win32_localtime get day^,hour^,minute^,month^,second^,year /format:table') do @if not "%%f"=="" ( set "_DT_D_=%%a" & set "_DT_H_=%%b" & set "_DT_I_=%%c" & set "_DT_M_=%%d" & set "_DT_S_=%%e" & set "_DT_Y_=%%f" )
    ) else (
        @set "_DT_T_=1234567890 "
    )
    @if errorlevel 1 (
        @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "Y" "M" "D" "H" "I" "S") do @set "_DT_%%~?_=%%~?"
        @for %%? in ("Date" "Time") do @for /f "skip=2 tokens=1,3" %%a in ('reg query "HKCU\Control Panel\International" /v ?%%~? 2^>nul') do @for /f %%x in ('echo:%%_DT_%%a_%%') do @if "%%x"=="%%a" set "_DT_%%a_=%%b"
        @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_T_=%%a%%b%%c"
    )
    @if errorlevel 1 (
        @if "%_DT_iDate_%"=="0" (set "_DT_F_=_DT_D_ _DT_Y_ _DT_M_") else if "%_DT_iDate_%"=="1" (set "_DT_F_=_DT_D_ _DT_M_ _DT_Y_") else if "%_DT_iDate_%"=="2" (set "_DT_F_=_DT_Y_ _DT_M_ _DT_D_")
        @for /f "tokens=1-4* delims=%_DT_sDate_%" %%a in ('date/t') do @for /f "tokens=1-3" %%x in ('echo:%%_DT_F_%%') do @set "%%x=%%a" & set "%%y=%%b" & set "%%z=%%c"
        @for /f "tokens=1-3 delims=%_DT_T_%" %%a in ("%time%") do @set "_DT_H_=%%a" & set "_DT_I_=%%b" & set "_DT_S_=%%c"
        @for %%? in ("iDate" "sDate" "iTime" "sTime" "F" "T") do @set "_DT_%%~?_="
    )
    @for %%i in ("Y"                ) do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+=  0 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-4%%"') do @set "_DT_%%~i_=%%~k"
    @for %%i in ("M" "D" "H" "I" "S") do @for /f %%j in ('echo:"%%_DT_%%~i_%%"') do @set /a _DT_%%~i_+=100 & @for /f %%k in ('echo:"%%_DT_%%~i_:~-2%%"') do @set "_DT_%%~i_=%%~k"
@exit/b
1
SerGeeK Kasimov

Dies ist meine 2 Cent für adatetime string. Bei MM DD YYYY-Systemen wechseln die ersten und zweiten %DATE:~-Einträge.

    REM ====================================================================================
    REM CREATE UNIQUE DATETIME STRING FOR ADDING TO FILENAME
    REM ====================================================================================
    REM Can handle dd DDxMMxYYYY and DDxMMxYYYY > CREATES YYYYMMDDHHMMSS (x= any character)
    REM ====================================================================================
    REM CHECK for SHORTDATE dd DDxMMxYYYY 
    IF "%DATE:~0,1%" GTR "3" (
        SET DATETIME=%DATE:~9,4%%DATE:~6,2%%DATE:~3,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
    ) ELSE (
    REM ASSUMES SHORTDATE DDxMMxYYYY
        SET DATETIME=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%%TIME:~0,2%%TIME:~3,2%%TIME:~6,2%
        )
    REM CORRECT FOR HOURS BELOW 10
    IF %DATETIME:~8,2% LSS 10 SET DATETIME=%DATETIME:~0,8%0%DATETIME:~9,5%
    ECHO %DATETIME%
1
Case

Für eine sehr einfache Lösung für numerische Daten zur Verwendung in Dateinamen verwenden Sie den folgenden Code:

set month=%date:~4,2%
set day=%date:~7,2%
set curTimestamp=%month%%day%%year%

rem then the you can add a prefix and a file extension easily like this
echo updates%curTimestamp%.txt
0
Thomas Boomer

Dieses Skript verwendet eine WMI-Schnittstelle, auf die primär über das WMIC-Tool zugegriffen wird, das seit Windows XP Professional ein fester Bestandteil von Windows ist (Home Edition wird ebenfalls unterstützt, das Tool wird jedoch standardmäßig nicht installiert). Das Skript implementiert auch eine Problemumgehung des fehlenden WMIC-Tools, indem ein WSH-VBScript erstellt und aufgerufen wird, um auf eine WMI-Schnittstelle zuzugreifen und die Uhrzeit mit demselben Format wie das WMIC-Tool auf der Konsole auszugeben.

@ECHO OFF
REM Returns: RETURN
REM Modify:  RETURN, StdOut
REM Required - mandatory: none
REM Required - optionaly: format strings delimited by a space to format an output delimited by predefined delimiter
REM    YYYY = 4-digit year
REM      MM = 2-digit month
REM      DD = 2-digit day
REM      hh = 2-digit hour
REM      mm = 2-digit minute
REM      ss = 2-digit second
REM      ms = 3-digit millisecond

CALL :getTime %*
ECHO %RETURN%
GOTO :EOF


REM SUBROUTINE
REM Returns: RETURN
REM Modify:  RETURN
REM Required - mandatory: none
REM Required - optionaly: format strings delimited by a space to format an output delimited by predefined delimiter
REM    YYYY = 4-digit year
REM      MM = 2-digit month
REM      DD = 2-digit day
REM      hh = 2-digit hour
REM      mm = 2-digit minute
REM      ss = 2-digit second
REM      ms = 3-digit millisecond
:getTime
  SETLOCAL EnableDelayedExpansion
    SET DELIM=-
    WHERE /Q wmic.exe
    IF NOT ERRORLEVEL 1 FOR /F "usebackq skip=1 tokens=*" %%x IN (`wmic.exe os get LocalDateTime`) DO (SET DT=%%x & GOTO getTime_Parse)
    SET _TMP=%TEMP:"=%
    ECHO Wscript.StdOut.WriteLine (GetObject("winmgmts:root\cimv2:[email protected]").LocalDateTime)>"%_TMP%\get_time_local-helper.vbs"
    FOR /F "usebackq tokens=*" %%x IN (`cscript //B //NoLogo "%_TMP%\get_time_local-helper.vbs"`) DO (SET DT=%%x & GOTO getTime_Parse)
    :getTime_Parse
      SET _RET=
      IF "%1" EQU "" (
        SET _RET=%DT:~0,4%%DELIM%%DT:~4,2%%DELIM%%DT:~6,2%%DELIM%%DT:~8,2%%DELIM%%DT:~10,2%%DELIM%%DT:~12,2%%DELIM%%DT:~15,3%
      ) ELSE (
        REM Not recognized format strings are ignored during parsing - no error is reported.
       :getTime_ParseLoop
         SET _VAL=
         IF "%1" EQU "YYYY" SET _VAL=%DT:~0,4%
         IF "%1" EQU "MM"   SET _VAL=%DT:~4,2%
         IF "%1" EQU "DD"   SET _VAL=%DT:~6,2%
         IF "%1" EQU "hh"   SET _VAL=%DT:~8,2%
         IF "%1" EQU "mm"   SET _VAL=%DT:~10,2%
         IF "%1" EQU "ss"   SET _VAL=%DT:~12,2%
         IF "%1" EQU "ms"   SET _VAL=%DT:~15,3%
         IF DEFINED _VAL (
           IF DEFINED _RET (
             SET _RET=!_RET!%DELIM%!_VAL!
           ) ELSE (
             SET _RET=!_VAL!
           )
         )
         SHIFT
         IF "%1" NEQ "" GOTO getTime_ParseLoop
      )
  ENDLOCAL & SET RETURN=%_RET%
GOTO :EOF
0
Petr Matlas
:: =============================================================
:: Batch file to display Date and Time seprated by undescore.
:: =============================================================
:: Read the system date.
:: =============================================================
@SET MyDate=%DATE%
@SET MyDate=%MyDate:/=:%
@SET MyDate=%MyDate:-=:%
@SET MyDate=%MyDate: =:%
@SET MyDate=%MyDate:\=:%
@SET MyDate=%MyDate::=_%
:: =============================================================
:: Read the system time.
:: =============================================================
@SET MyTime=%TIME%
@SET MyTime=%MyTime: =0%
@SET MyTime=%MyTime:.=:%
@SET MyTime=%MyTime::=_%
:: =============================================================
:: Build the DateTime string.
:: =============================================================
@SET DateTime=%MyDate%_%MyTime%
:: =============================================================
:: Display the Date and Time as it is now.
:: =============================================================
@ECHO MyDate="%MyDate%" MyTime="%MyTime%" DateTime="%DateTime%"
:: =============================================================
:: Wait before close.
:: =============================================================
@PAUSE
:: =============================================================
0
Christo

Bei Verwendung von% tritt ein Hex-Operationsfehler auf, wenn der Zeitwert 7-9 ist. Um dies zu vermeiden, verwenden Sie DelayedExpansion und greifen Sie die Zeitwerte mit! Min: ~ 1!

Eine alternative Methode, wenn Sie PowerShell haben, ruft das auf:

for /F "usebackq delims=Z" %%i IN (`powershell Get-Date -format u`) do (set server-time=%%i)
0
Leland

Teilen Sie die Ergebnisse des Datumsbefehls durch Schrägstrich auf. Dann können Sie die Token in die entsprechenden Variablen verschieben.

FOR /F "tokens=1-3 delims=/" %%a IN ("%date:~4%") DO (
SET _Month=%%a
SET _Day=%%b
SET _Year=%%c
)
ECHO Month %_Month%
ECHO Day %_Day%
ECHO Year %_Year%
0
Casey

Ein einfacher einzeiliger Trick zur Vermeidung einer frühen Variablenerweiterung ist cmd /c echo ^%time^%

cmd /c echo ^%time^% & dir /s somelongcommand & cmd /c echo ^%time^%
0
tresf

Verwenden Sie REG zum Speichern/Ändern/Wiederherstellen der Werte, die für Ihre bat-Datei am nützlichsten sind. Dies ist Windows 7, für andere Versionen benötigen Sie möglicherweise einen anderen Schlüsselnamen.

reg save    "HKEY_CURRENT_USER\Control Panel\International" _tmp.reg /y
reg add     "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate  /d "yyyy-MM-dd" /f
set file=%DATE%-%TIME: =0%
reg restore "HKEY_CURRENT_USER\Control Panel\International" _tmp.reg
set file=%file::=-%
set file=%file:.=-%
set file
0
Malcolm