2012-11-29 02:49:32 +0000 2012-11-29 02:49:32 +0000
21
21

Ich verwende Datum und Zeiten in einer Batch-Datei, um einen Dateinamen zu erzeugen

Ich führe ein Programm aus einer Batch-Datei aus, das, wenn es fertig ist, eine automatische Sicherung meiner MySQL-Datenbank durchführt.

Ich möchte, dass die Batch-Datei für jeden Lauf eine andere Sicherung erzeugt, damit ich eine Rückverfolgung durchführen kann.

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

Ich habe ein paar Dinge gegoogelt, die sagten, versuchen Sie %DATE:~4% und %Date.Year%, aber ich erhalte einen Fehler, der besagt The system cannot find the specified path.

Wenn ich den Versuch, einen Zeitstempel zu setzen, entferne, funktioniert das Skript gut, aber es überschreibt die vorherige Sicherung

Hier ist der Abschnitt des Codes, von dem 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?

Antworten (6)

28
28
28
2012-11-29 18:00:07 +0000

Das Datums- und Zeitformat hängt davon ab, was Sie im Applet Region und Sprache der Systemsteuerung angegeben haben.

Führen Sie die folgende Batch-Datei aus (die tt/mm/jjjjjj und hh:mm:ss voraussetzt) und modifizieren Sie die Teilzeichenketten-Extraktion (unter Verwendung der Zeichen : und ~) wie erforderlich, um die richtigen Teile aus Datums- und Zeitzeichenketten zu erhalten:

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

Für weitere Hilfe zur Teilzeichenketten-Extraktion geben Sie set /? an der Eingabeaufforderung ein oder lesen Sie diese Seite .

8
8
8
2015-03-05 20:56:02 +0000

Hier ist, was für mich funktioniert 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
3
3
3
2015-06-25 20:25:48 +0000

Mit ein wenig Feinschliff bekam ich dieses

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

2
2
2
2019-03-28 17:59:29 +0000

Entschuldigen Sie die Verspätung…

Der einzige zuverlässige Weg, unabhängig von der regionalen Einstellung ein geeignetes Datum zu erhalten, ist die Lösung von foxidrive @ https://stackoverflow.com/questions/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
1
1
1
2018-06-15 08:44:00 +0000

ich denke, das verbessert die Antwort von @Nick Rogers ein wenig.

EX: bei der deutschen Locate (de_DE) gibt es eine führende Leerstelle bei Stunden unter 10.

ich wollte auch eine führende Null zur vollen Stunde. “echo - !^_hh! -” ergibt “09” statt nur “9”

also breche ich den Code zur besseren Lesbarkeit in zwei Teile. dieses Beispiel sollte auf mehr Locales passen.

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

Bemerkung: manchmal muss die STUNDE escaped werden, siehe Innencode

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

Ausgaben: echo fullTime = 15062018-10182821

0
0
0
2018-03-02 11:24:58 +0000

die kürzeste (vielseitigste?) Antwort ist gemäß dem folgenden TimeStamp.cmd-Skript, das nur drei Zeilen Code enthält (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 die Notwendigkeit, in einer FOR-Anweisung in einer Batch-Datei %% statt % für die Variable zu verwenden

…die Ausführung ergibt (leere Zeilen 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"