15

Я запускаю программу из командного файла, который, когда это сделано, выполняет автоматическое резервное копирование моей базы данных MySQL.

Мне бы хотелось, чтобы командный файл создавал разные резервные копии для каждого прогона, чтобы я мог вернуться.

Желаемое имя файла будет gnucash_shockwave-20121128210344.sql (формат даты ГГГГ-ММ-ДД-ЧЧ-ММ-СС)

Я погуглил несколько вещей, которые говорят, попробуйте %DATE:~4% и %Date.Year% но я получаю ошибку, которая говорит, что The system cannot find the specified path.

Если я удаляю попытку поставить метку времени, скрипт работает нормально, но перезаписывает предыдущую резервную копию

Вот фрагмент кода, о котором я говорю:

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

Какие-либо предложения?

5 ответов5

24

Формат даты и времени зависит от того, что вы указали в апплете « Регион и язык» .

Запустите следующий пакетный файл (который предполагает дд / мм / гггг и чч: мм: сс) и измените извлечение подстроки (используя символы: и ~), как требуется, чтобы получить правильные детали из строк даты и времени:

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

Для получения дополнительной помощи по извлечению подстроки введите set /? в командной строке или увидеть эту страницу.

7

Вот что сработало для меня.

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
2

С небольшой настройкой я получил это

@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


Результат:

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

0

я думаю, что это улучшает ответ @Nick Rogers немного.

Пример: в немецком locate (de_DE) ведущие пробелы в часах ниже 10.

также я хотел ведущий ноль в час. эхо!^ _Hh! - "дает" 09 "вместо только" 9 "

поэтому я разбил код на две части для лучшего чтения. этот пример должен соответствовать большему количеству локалей.

+ бонус: _ms = миллисекунды, или последние две цифры (-;

примечание: иногда требуется ЧАС, см. код внутри

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

выходы: echo fullTime = 15062018-10182821

0

самый короткий (самый универсальный?) Ответ в следующем сценарии TimeStamp.cmd, содержащем всего три строки кода (исключая комментарии и т. д.) ...

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

Обратите внимание на необходимость использовать %% вместо% для переменной в инструкции FOR в пакетном файле

... результаты выполнения (пустые строки и комментарии удалены)...

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"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .