Formatieren Sie Datum und Uhrzeit in einem Windows-Batch-Skript


192

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

Es ähnelt der Frage zum Stapelüberlauf, wie ein Datum in Batchdateien angehängt wird , jedoch 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



Sie können Leerzeichen in Ihrer datetimefVariablen ersetzen und stattdessen Nullen setzen. In Ihrem Beispiel:SET datetimef=%datetimef: =0%
SebaGra

Antworten:


148

Am Ende hatte ich dieses 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 musste ich zB Ihren 'eingestellten Monat =% Datum: ~ 3,2%' wie unten festlegen :: andernfalls 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%

11
Zu Ihrer Information, unter Windows Server 2003 und unter Windows 7 gab mir dieses Skript "201200Mo_085806" (korrektes Jahr und Uhrzeit).
Sfuqua

50
Als Hinweis für jemanden, der von Google hierher kommt (wie ich): Dies ist vom Gebietsschema abhängig, daher sind möglicherweise Anpassungen erforderlich, um unter nicht englischsprachigem Windows zu funktionieren!
PiotrK

Ich habe es so gemacht: Time / T> Time.dat set / P ftime = <Time.dat set fDate =% date: ~ 6 %% date: ~ 3,2 %% date: ~ 0,2 %% ftime: ~ 0,2 %% ftime: ~ 3,2% echo% fDate% -> 201310170928
Ice

Was macht% time: ~ 0,2% wo gibt es eine Dokumentation zur: ~,% ​​-Struktur?
user1605665

6
All dies kann in nur 2 Zeilen mit gewöhnlichem String-Austausch durchgeführt werden: stackoverflow.com/a/23558738/1879699
Andreas

71
@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

2
Unter Windows Server 2003 und Windows 7 gab mir dies die richtige Zeichenfolge. Viel eleganter als das, was ich in der Vergangenheit gebaut habe, also danke!
Sfuqua

3
Hier ist, was es mir in Windows 7 mit russischem Gebietsschema gibt. Aktuelle Zeit ist 2013-05-03T02: 22: 51, aber das Skript druckt: "2013-5.-01_02_22_51"
Nightcoder

7
Das% date% gibt unterschiedliche Zeichenfolgen mit unterschiedlichem Gebietsschema an.
AechoLiu

2
gibt 20146.0._173502 an mich zurück (tschechisches Gebietsschema)
Muflix

2
win7 64bit ultimative, falsche Zeit: 20140.01_131612, muss sein (2014.10.26_131612)
waza123

66

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

5
Beste Antwort auf SO für Fragen zur lokalunabhängigen Zeitstempelerzeugung im Batch.
Mike Campbell

2
Genial! Es sollte eine Möglichkeit geben, dies als Lösung zu markieren
Rado

48

Normalerweise mache ich das immer so, 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 gilt für das deutsche Datums- / Uhrzeitformat (TT.MM.JJJJ HH: MM: SS). Grundsätzlich verkette ich die Teilzeichenfolgen und ersetze schließlich alle Leerzeichen durch Nullen.

Kurze Erklärung der Funktionsweise von Teilzeichenfolgen:

%VARIABLE:~num_chars_to_skip,num_chars_to_keep%

Um nur das Jahr von einem Datum wie "29.03.2018" zu erhalten, verwenden Sie:

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

7
bei weitem die eleganteste Lösung, wenn Sie nur einen sauberen Zeitstempel benötigen (keine Leerzeichen oder andere Zeichen)
jvdneste

1
Konnte nicht mehr mit @jvdneste übereinstimmen, danke für das Teilen von mrt
this.user3272243

1
absolut großartig - und funktioniert [die erforderliche Syntax ist sehr verwirrend, aber das ist kaum das Problem des Posters]
JosephDoggie

38

Wenn PowerShell installiert ist, können Sie Datum und Uhrzeit einfach und zuverlässig in jedem gewünschten Format abrufen, zum 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 ist PowerShell heutzutage 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 überprüfen Sie Ihre Batch-Datei, wenn PowerShell verfügbar ist ...)

Sie mögen sich vernünftigerweise fragen: Warum überhaupt eine Batch-Datei verwenden, wenn Sie PowerShell verwenden können, um Datum und Uhrzeit abzurufen, aber ich denke, einige offensichtliche Gründe sind: (a) Sie sind mit PowerShell nicht allzu vertraut und bevorzugen es immer noch, die meisten zu tun Dinge auf altmodische Weise mit Batch-Dateien oder (b) Sie aktualisieren ein altes Skript und möchten nicht das Ganze auf PS portieren.


(a) in meinem Fall, und dies funktioniert perfekt (Fledermaus ist nur für meine Umgebung, aber ich habe gemischte Gebietsschemas auf verschiedenen PCs). Danke dir!
Ccalboni

30

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

SET LOGTIME=%TIME: =0%

Es ersetzt Leerzeichen durch Nullen und füllt die Stunde im Grunde genommen mit Nullen auf.

Nach einer kurzen Suche fand ich nicht heraus, ob Befehlserweiterungen erforderlich waren (funktionierte immer noch mit SETLOCAL DISABLEEXTENSIONS).


OK, Substitution in Variablen. Nun - wie kann man einen Doppelpunkt ersetzen ( :)?
Tomasz Gandor

@TomaszGandor Das funktioniert bei mir: echo %TIME: =:%aber wenn es nicht so ist, versuche vielleicht, dem :mit einem ^Like zu entkommen echo %TIME: =^:%(was auch bei mir funktioniert).
Opello

1
+1 der Einfachheit halber. Doppelpunkte sind in Dateinamen nicht gültig. set theTime =% Time :: =% löscht sie. Können Sie das Leerzeichen durch 0 ersetzen, die Doppelpunkte löschen und in einer einzelnen Anweisung auf 6 Zeichen kürzen (wodurch der Dezimalteil gelöscht wird)? Es ist keine große Sache, wenn es zwei oder drei Zeilen dauert. Ich bin nur Neugierig.
FahrerBill

Nicht das ich wüsste. Bitte folgen Sie, wenn Sie eine finden!
Opello

21

Wie bereits erwähnt, ist das Parsen von Datum und Uhrzeit nur dann sinnvoll, 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 festgestellt werden, aber wenn Sie alle Belastungen und Analysen durchführen, werden Sie immer noch in einer Situation sein, in der ein unerwartetes Format verwendet wird und weitere Optimierungen erforderlich sind.

Sie können auch ein externes Programm verwenden, das einen Datums-Slug in Ihrem bevorzugten Format zurückgibt. Dies hat jedoch die Nachteile, dass das Dienstprogramm mit Ihrem Skript / Stapel verteilt werden muss.

Es gibt auch Batch-Tricks, bei denen die CMOS-Uhr ziemlich roh verwendet wird, aber das ist für die meisten Menschen zu nahe an bloßen Drähten und auch nicht immer der bevorzugte Ort, um Datum und Uhrzeit abzurufen.

Im Folgenden finden Sie eine Lösung, mit der die oben genannten Probleme vermieden werden. Ja, es werden einige andere Probleme eingeführt, aber für meine Zwecke war dies die einfachste, klarste und portabelste Lösung zum Erstellen eines Datenstempels in .bat-Dateien für moderne Windows-Systeme. Dies ist nur ein Beispiel, aber ich denke, Sie werden sehen, wie Sie andere Datums- und / oder Zeitformate 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

3
Genau das, wonach ich gesucht habe. Etwas, das bei jeder Ländereinstellung funktioniert. Vielen Dank!
Lost_DM

+1 für die "modernen Windows-Systeme", mit denen wir uns befassen müssen :) Scherz beiseite, dies ist eine sehr geniale und, wie Sie sagten, tragbare Methode, um mit dem Problem umzugehen.
Zach Young

9
Dies ist eine schreckliche Lösung. Wenn dies fehlschlägt, wird eine globale Einstellung dauerhaft geändert. Es führt auch Rennbedingungen mit anderen Anwendungen ein.
MikeKulls

Sie können das reg query "HKCU\Control Panel\International" /v sShortDateTeil verwenden, ohne die Registrierungseinstellung zu ändern (Übung dem Leser überlassen!).
Trikasse

9

Das Folgende ist möglicherweise keine direkte, sondern eine enge 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 kann es inspirierend sein.


9

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 das Zeichen .und das Leerzeichen werden durch einen Unterstrich ersetzt.

Beispielausgabe (aufgenommen am Mittwoch, den 05.08.15 um 12:49 Uhr mit 50 Sekunden und 93 Millisekunden):

echo %mytimestamp%
Wed_08052015_124950_93

Wenn die Stunde kleiner als 12 ist, setzen Sie mydate =% date: / =% set mytime =% time :: =% set mytime =% mytime: = 0% set mytimestamp =% mydate: = _% _% mytime :. = _ %
Ragche

8
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

Die offset:lengthFormatierung, die mit dem SETBefehl in Windows unterstützt wird, ermöglicht es Ihnen nicht, das zu füllen, 0wie Sie anscheinend interessiert sind.

Sie können jedoch ein BATCH-Skript codieren, um zu überprüfen, ob die Stunde kleiner als ist, 10und
entsprechend mit einer anderen echoZeichenfolge auffüllen.

Unter diesem Link finden Sie einige Informationen zum SETBefehl .


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

In Unix-Bash (verfügbar mit Cygwin unter Windows) ist es ganz einfach zu sagen:

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

Und es polstert immer richtig.


6

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


Es läuft auf einem englischen Server (Betriebssystemname: Microsoft (R) Windows (R) Server 2003 Standard x64 Edition, Betriebssystemversion: 5.2.3790 Service Pack 2 Build 3790)
Ice

1
und auch auf deutschem Server getestet (Wirkungsname: Microsoft® Windows Server® 2008 Enterprise, Versionsversion: 6.0.6002 Service Pack 2 Build 6002)
Ice

1
Auch dieser ist in Ordnung: (Eigentümername: Microsoft Windows Server 2012 Standard, Wirkungsversion: 6.2.9200 Nicht zutreffend Build 9200)
Ice

4
::========================================================================  
::== 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%  

Die erste Zeile wird immer in diesem Format ausgegeben, unabhängig von der Zeitzone:
20150515150941.077000 + 120
So können Sie die Ausgabe nur so formatieren, dass sie Ihren Wünschen entspricht.


4

Diese bat-Datei (als datetimestr.bat speichern) erzeugt die datetime-Zeichenfolge dreimal: (1) lange datetime-Zeichenfolge mit Wochentag und Sekunden, (2) kurze datetime-Zeichenfolge ohne diese 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 die richtige Anerkennung zu finden, 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 erleichtert das Lesen und Verstehen des Codes.


4

Ich bin wirklich neu in Batch-Dateien und das ist mein Code! (Ich bin nicht sicher warum, aber ich konnte nicht kombinieren Datum / t und Zeit / t zusammen und ich konnte nicht verwenden % date% und % time% direkt , ohne eine Variable ...)

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

Es wird von anderen wiederverwendet (die Frage war, ein formatiertes Zeitdatum als Dateinamen zu erhalten).


4

Es gibt noch eine andere einfache Möglichkeit:

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

3

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%)

Nimmt es eine bestimmte regionale Umgebung an?
Peter Mortensen

1
Nach ss64.com/nt/syntax-variables.html der %TIME%und %DATE%Variablen verwenden dasselbe Format wie die TIMEund DATEBefehle, respectively. Auf meinem System stimmen die Variablen nicht mit meinen regionalen Einstellungen überein.
M. Dudley

3

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

Ich habe auch diesen cleveren Registrierungstrick verwendet, der zuvor von "jph" beschrieben wurde. IMHO ist der einfachste Weg, um "yyyy_MM_dd"auf jedem neuen oder alten Windows-System eine 100% konsistente Formatierung des Datums zu erreichen . Die Änderung an einem Registrierungswert ist sofort vorübergehend und trivial. Es dauert nur einige Millisekunden, bevor es sofort wieder zurückgesetzt wird.

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

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: generates a custom formatted timestamp string using date and time.
:: run this batch file for an instant demo.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

@ECHO OFF
SETLOCAL & MODE CON:COLS=80 LINES=15 & COLOR 0A

:: --- 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 [HH:MM:SS.SS] TO THREE SEPARATE VARIABLES [HH] [MM] [SS.SS]
FOR /F "tokens=1-3 delims=:" %%A IN ('echo %time%') DO (
SET HOUR=%%A
SET MINUTES=%%B
SET SECONDS=%%C
)

:: --- CHOOSE ONE OF THESE TWO OPTIONS :
:: --- FOR 4 DIGIT SECONDS        //REMOVES THE DOT FROM THE SECONDS VARIABLE [SS.SS]
:: SET SECONDS=%SECONDS:.=%
:: --- FOR 2 DIGIT SECONDS        //GETS THE FIRST TWO DIGITS FROM THE SECONDS VARIABLE [SS.SS]
SET SECONDS=%SECONDS:~0,2% 

:: --- FROM 12 AM TO 9 AM, THE HOUR VARIABLE WE EXTRACTED FROM %TIME% RETURNS A SINGLE DIGIT, 
:: --- WE PREFIX A ZERO CHARACTER TO THOSE CASES, SO THAT OUR WANTED TIMESTAMP
:: --- ALWAYS GENERATES DOUBLE-DIGIT HOURS (24-HOUR CLOCK TIME SYSTEM).
IF %HOUR%==0 (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
SET TIMESTAMP=%MYDATE%__%HOUR%_%MINUTES%_%SECONDS%

:: --- VIEW THE RESULT IN THE CONSOLE SCREEN
ECHO.
ECHO    Generate a custom formatted timestamp string using date and time.
ECHO.
ECHO    Your timestamp is:    %TIMESTAMP%
ECHO.
ECHO.
ECHO    Job is done. Press any key to exit . . .
PAUSE > NUL

EXIT

Funktioniert auch unter Windows 2019. Ich werde Ihre Lösung behalten, ich mag es :)
user225479

Frage, ich habe gerade festgestellt, dass nach Mitternacht die nachfolgende "0" in der Ausgabe gelöscht wird. Irgendeine Idee warum? Meine Ausgabe mit Ihrem Skript lautet: Ihr Zeitstempel lautet: 2019_09_16__0_58_07 Anstelle von ..00_58_07. Aber nach 1 Uhr funktioniert es wie erwartet (und es wird ausgegeben: ..01_01_56).
user225479

Ich habe der ELSE-Anweisung IF% HOUR% == 0 (SET HOUR = 00) hinzugefügt. Das sollte es beheben, hoffe ich :)
user225479

Vielen Dank für das Feedback @ user225479. Ich habe den Code behoben. Alle möglichen Permutationen der in das 24-Stunden-Format konvertierten HOUR-Variablen funktionieren jetzt korrekt. Ich habe auch das Layout geändert, damit es leichter zu lesen ist.
derty2

2
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

Erstellen Sie eine Datei mit dem Namen "search_files.bat" und platzieren Sie den folgenden Inhalt in der Datei. Doppelklicken Sie dann darauf. Die temporäre Variable% THH% wurde eingerichtet, um den AM angemessen 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

Ich mag die Kurzversion über @The lorax, aber für andere Spracheinstellungen kann es etwas anders sein.

In deutschen Spracheinstellungen (mit natürlichem Datumsformat: TT.MM.JJJJ) 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

1

Das sind meine 2 Cent für a datetime string. Bei MM DD YYYYSystemen wechseln Sie den ersten und den zweiten %DATE:~Eintrag.

    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

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 auf der Vorderseite verursachte vor 10 Uhr Analyseprobleme. Um diese Hürde zu überwinden und auch das Parsen der meisten Weltzeitformate zu ermöglichen, habe ich mir diese einfache Routine ausgedacht, die anscheinend recht gut funktioniert.

: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, für die Sie die Zeit (in Centisekunden) als zweiten Parameter enthalten möchten. Beispielsweise:

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

(* Chris *)


1

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

Verwenden Sie in solchen Situationen einen einfachen Standard-Programmieransatz: Anstatt eine unbekannte Entität mit großem Aufwand zu analysieren, speichern Sie einfach die aktuelle Konfiguration, setzen Sie sie auf einen bekannten Status zurück, extrahieren Sie die Informationen und stellen Sie den ursprünglichen Status wieder her. Verwenden Sie nur Standard-Windows-Ressourcen.

Insbesondere werden die Datums- und Uhrzeitformate unter dem Registrierungsschlüssel HKCU \ Control Panel \ International \ in [MS-Definition] "values": "sTimeFormat" und "sShortDate" gespeichert. Reg ist der Konsolenregistrierungseditor, der in allen Windows-Versionen enthalten ist. Erhöhte Berechtigungen sind nicht erforderlich, um den HKCU-Schlüssel zu ändern

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.

Ich verstehe Aus Gründen nicht, die „SShortDate“ Wert Zurücksetzen wird sofort wirksam in einem Konsolenfenster , aber die sehr ähnlich „sTimeFormat“ Wert Neueinstellung ist nicht wirksam , bis ein neues Konsolenfenster geöffnet wird. Das einzige, was geändert werden kann, ist das Trennzeichen - die Ziffernpositionen sind festgelegt. Ebenso soll das Zeit-Token "HH" führenden Nullen vorangestellt werden, tut dies jedoch nicht. Glücklicherweise sind die Problemumgehungen einfach.


-1 "Anstatt eine führende Null hinzuzufügen, können Sie die Maschinenkonfiguration nicht stören, sie nach Ihren Wünschen ändern und dann Ihr Ding machen." Dieser Ansatz ist nicht von dieser Welt, erfordert einen erheblichen Aufwand und kann zu einer unendlichen Anzahl unerwünschter Konsequenzen führen. Und ich möchte nicht einmal die Diskussion über Lesbarkeit und das erwartete Standardcodeverhalten beginnen. ein dickes Lob.
Vaitrafra

Das Zurücksetzen des sTimeFormatZeitformats ist nutzlos . Nee. for /f "delims=" %%G in ('cmd /C echo SET "DateTime=%%date%%__%%time%%"') do %%G
Wenden Sie

1

Dieses Skript verwendet eine WMI-Schnittstelle, auf die primär über das WMIC-Tool zugegriffen wird, das seit Windows XP Professional ein wesentlicher Bestandteil von Windows ist (Home Edition wird ebenfalls unterstützt, das Tool wird jedoch nicht standardmäßig installiert). Das Skript implementiert auch eine Problemumgehung für das fehlende WMIC-Tool, indem es ein WSH-vbscript erstellt und aufruft, um auf eine WMI-Schnittstelle zuzugreifen und die Zeit mit demselben Format wie das WMIC-Tool in die Konsolenausgabe zu schreiben.

@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:Win32_OperatingSystem=@").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

1

Ein guter einzeiliger Trick, um eine frühe variable Erweiterung zu vermeiden, ist die Verwendung cmd /c echo ^%time^%

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

0
:: =============================================================
:: 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

Verwenden Sie für eine sehr einfache Lösung für das numerische Datum zur Verwendung in Dateinamen 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

Teilen Sie die Ergebnisse des Datumsbefehls durch einen Schrägstrich auf, und verschieben Sie dann alle Token in die entsprechenden Variablen.

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%
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.