Verwenden von Datum und Uhrzeit in einer Stapeldatei zum Erstellen eines Dateinamens

20

Ich führe ein Programm aus einer Batch-Datei aus, die dann eine automatische Sicherung meiner MySQL-Datenbank durchführt.

Ich möchte, dass die Batch-Datei für jeden Lauf eine andere Sicherung erstellt, damit ich zurückverfolgen kann.

Der gewünschte Dateiname wäre gnucash_shockwave-20121128210344.sql (Datumsformat JJJJ-MM-TT-HH-MM-SS)

Ich habe ein paar Dinge gegoogelt, die gesagt haben, versuchen Sie es %DATE:~4%und %Date.Year%ich erhalte einen Fehler, der besagtThe system cannot find the specified path.

Wenn ich den Zeitstempelversuch entferne, funktioniert das Skript einwandfrei, überschreibt jedoch die vorherige Sicherung

Hier ist der Codeabschnitt, über den ich spreche:

@REM *** EXECUTION ***
echo. Starting backup...
SET timestamp %DATE:~-4%%DATE:~4,2%%DATE:~7,2%%TIME%
%mysqldir%\mysqldump -u %mysqluser% -p%mysqlpassword% -h %mysqlhost% -P %mysqlport% --databases --routines --verbose gnucash_shockwave > %BackupDir%\gnucash_shockwave-%timestamp%.sql

echo.------------------------------------------------------
echo. Backup complete!

Irgendwelche Vorschläge?

guyfromfl
quelle
Nachdem ich Ihre Konten neu zugeordnet habe, sollten Sie jetzt in der Lage sein, sich anzumelden und Ihre eigenen Beiträge und Antworten auf Ihre Fragen zu kommentieren.
Slhck
slhck, lol danke ich habe mich gefragt, was los ist, dann erinnerte ich mich, dass ich nicht am Stapelüberlauf war lol
guyfromfl 29.11.12
Ersetzen von% date% durch% date: ~ 6,4% -% date: ~ 3,2% -% date: ~ 0,2% gearbeitet
MagTun

Antworten:

28

Das Datums- und Uhrzeitformat hängt davon ab, was Sie im Applet der Regions- und Sprachsteuerung angegeben haben .

Führen Sie die folgende Stapeldatei aus ( dd / mm / yyyy und hh: mm: ss vorausgesetzt ) und ändern Sie die Teilstring-Extraktion (unter Verwendung der Zeichen: und ~) nach Bedarf, um die richtigen Teile aus Datums- und Uhrzeitzeichenfolgen abzurufen :

@echo off
cls
echo Date format = %date%
echo dd = %date:~0,2%
echo mm = %date:~3,2%
echo yyyy = %date:~6,4%
echo.
echo Time format = %time%
echo hh = %time:~0,2%
echo mm = %time:~3,2%
echo ss = %time:~6,2%
echo.
echo Timestamp = %date:~6,4%-%date:~3,2%-%date:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2%

Weitere Hilfe zum Extrahieren von Teilzeichenfolgen erhalten Sie, indem Sie set /?an der Eingabeaufforderung Folgendes eingeben oder auf dieser Seite nachsehen .

Karan
quelle
Danke, ich glaube ich verstehe, wie das jetzt funktioniert. Ich bin nicht im Büro, werde es aber versuchen, sobald ich dort bin und zurückschicke. Wir verwenden Windows 8 Danke für die Hilfe
guyfromfl
Verstanden, ich musste die String-Positionen des Datums anpassen, wahrscheinlich wegen meiner Position und Sprache, aber das hat den Trick getan! Vielen Dank!
guyfromfl
Um ein vom Gebietsschema unabhängiges Datum zu erhalten, verwenden Sie stattdessen
wmic
Diese Lösung kann auf verschiedenen Maschinen zu unterschiedlichen Ergebnissen führen.
Mehdi Dehghani
Ich denke, etwas hat sich mit der Datumsausgabe geändert, die ich > echo yyyy = %DATE:~6,4%produzieren kann yyyy = /20/. Ist echo yyyy = %DATE:~10,4%aber yyyy = 2019.
teeks99
7

Hier ist, was für mich gearbeitet hat.

Format - mmddyyyy_HHMMSS

echo %DATE% %TIME%

Date format = Thu 03/05/2015 15:48:26.22

echo mm = %date:~4,2%

echo dd = %date:~7,2%

echo yyyy = %date:~10,4%

echo Timestamp = %date:~4,2%%date:~7,2%%date:~10,4%_%time:~0,2%%time:~3,2%%time:~6,2%

Timestamp - 03052015_154013
abbs
quelle
3
Willkommen bei Super User! Könnten Sie bitte Ihre Antwort so bearbeiten, dass sie eine Erklärung der Funktionsweise Ihrer Befehle enthält?
Hervorragend
Sie beantworten die falsche Frage. In der Frage des OP wird nach JJJJMMTT gefragt. Diese Antwort gibt MMDDYYYY.
Scott
Es gibt nichts Schöneres, als mit einer Frage zu Stack zu kommen und die perfekte Antwort zu haben, als dort zu sitzen und darauf zu warten, den Tag für mich zu retten. Vielen Dank @abbs und Excelll
im Uhrzeigersinn
3

Mit ein wenig Fingerspitzengefühl bekam ich das

@echo off
cls
echo Date format = %date%
echo dd = %date:~0,2%
echo mm = %date:~3,2%
echo yyyy = %date:~6,8%
echo.
echo Time format = %time%
echo hh = %time:~0,2%
echo mm = %time:~3,2%
echo ss = %time:~6,2%
echo.
echo Timestamp = %date:~0,2%_%date:~3,2%_%date:~6,8%-%time:~0,2%_%time:~3,2%_%time:~6,2%
ECHO "TEST..." > test-%date:~0,2%_%date:~3,2%_%date:~6,8%-%time:~0,2%_%time:~3,2%_%time:~6,2%.txt


Ergebnis:

"test-do_25_06-2015-22_21_51.txt" (Thursday_25th_June_2015-22:21.51)

André Verwijs
quelle
Wie unterscheidet sich das von den anderen Antworten?
suspectus
@suspectus: Diese Antwort unterscheidet sich von der Antwort von abbs darin, dass abbs eine US-Region (dh Gebietsschema) mit %DATE%~ Ddd MM/DD/YYYYannimmt, während diese eine Nicht-US-Region mit %DATE%~ DD/MM/YYYY(ohne Wochentag) annimmt . Und dieser unterscheidet sich von Karans Antwort darin, dass dieser falsch ist - die Frage fragt nach JJJJMMTT; Diese Antwort ergibt TT_MM – JJJJ.
Scott
2

Entschuldigung für die Verspätung ...

Die einzige verlässliche Möglichkeit, ein geeignetes Datum zu erhalten, ist die Lösung von foxidrive @ /programming/11037831/filename-timestamp-in-windows-cmd-batch-script

@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
Eric Ouellet
quelle
1

Ich denke, dies verbessert @ Nick Rogers Antwort ein wenig.

EX: mit dem deutschen locate (de_DE) gibt es bei stunden unter 10 einen führenden whitespace.

Ich wollte auch eine führende Null zur vollen Stunde. "echo -! ^ _ hh! -" gibt "09" statt nur "9"

Also zerlege ich den Code in zwei Teile, um ihn besser lesen zu können. Dieses Beispiel sollte mit mehr Gebietsschemas übereinstimmen.

+ Bonus: _ms = Millisekunden oder was auch immer die letzten beiden Ziffern sind (-;

Bemerkung: Manchmal muss die HOUR maskiert werden, siehe Code im Inneren

SETLOCAL
SETLOCAL EnableExtensions
SETLOCAL EnableDelayedExpansion
@ECHO ON
@rem use FOR /F to 'break out' the components of %DATE% and %TIME%, assuming 'yyyy/mm/dd' format date i.e.
@rem works also with german standard format dd.mm.yyyy

echo ----- date -----
    echo _%date%_
    for /F "tokens=1-3 delims=.-/" %%i IN ("%date%") DO Set "_Y=%%i"& Set "_M=%%j"& Set "_D=%%k"
    @rem Switch the year and day if appropriate
    IF "xx%_D:~2%" == "xx" Set "_Y=%_D%"& Set "_D=%_Y%"
    set __date=%_Y%%_M%%_D%
    echo _%__date%_
echo ----- date -----

echo ----- time -----
    echo _%time%_
    for /F "tokens=1-4 delims=:," %%l IN ("%time%") DO Set "_tmp_hh=%%l"& Set "_mm=%%m"& Set "_ss=%%n"& Set "_ms=%%o"
    @rem add leading zero to hour if necessary
    if %_tmp_hh% LSS 10 (set _hh=^0%_tmp_hh:~1,1%) ELSE (set _hh=%time:~0,2%)
    @rem sometimes the HOUR needs to be escaped, like this
    echo - !^_hh! -
    set __time=%_hh%%_mm%%_ss%%_ms%
    echo _%__time%_
echo ----- time -----

    Set fullTime=%_Y%%_M%%_D%-%_hh%%_mm%%_ss%%_ms%
    echo _%fullTime%_
pause

Ausgänge: Echo fullTime = 15062018-10182821

le luxe fou
quelle
0

Die kürzeste (vielseitigste?) Antwort lautet wie folgt: TimeStamp.cmd-Skript mit nur drei Codezeilen (ohne Kommentare usw.)

@ECHO ON
@REM use FOR /F to 'break out' the components of %DATE% and %TIME%, assuming 'yyyy/mm/dd' format date i.e.

    for /F "tokens=1-6* delims=.:-/ " %%i IN ("%DATE% %TIME%") DO Set "YYYY=%%i"& Set "MM=%%j"& Set "DD=%%k"& Set "HH=%%l"& Set "MI=%%m"& Set "SS=%%n"

@REM Switch the year and day if appropriate

    IF NOT "X%DD:~2%" == "X" Set "YYYY=%DD%"& Set "DD=%YYYY%"

    Set "TimeStamp=%YYYY%%MM%%DD%%HH%%MI%%SS%"

Beachten Sie, dass für die Variable in einer FOR-Anweisung in einer Batchdatei %% anstelle von% verwendet werden muss

... Ausführungserträge (Leerzeilen und Kommentare entfernt) ...

C:\>timestamp.cmd
C:\>for /F "tokens=1-6* delims=.:-/ " %i IN ("2018/03/02 11:17:43.35") DO Set "YYYY=%i"  & Set "MM=%j"  & Set "DD=%k"  & Set "HH=%l"  & Set "MI=%m"  & Set "SS=%n"
C:\>Set "YYYY=2018"  & Set "MM=03"  & Set "DD=02"  & Set "HH=11"  & Set "MI=17"  & Set "SS=43"
C:\>IF NOT "X" == "X" Set "YYYY=02"  & Set "DD=2018"
C:\>Set "TimeStamp=20180302111743"
Nick Rogers
quelle