Использование даты и времени в командном файле для создания имени файла

20

Я запускаю программу из командного файла, который, когда это сделано, выполняет автоматическое резервное копирование моей базы данных 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!

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

guyfromfl
источник
Я повторно связал ваши учетные записи, теперь вы сможете войти в систему и комментировать свои собственные сообщения и ответы на свои вопросы.
slhck
slhck, lol спасибо, мне было интересно, что происходит, тогда я вспомнил, что у меня не было переполнения стека lol
guyfromfl
замена% date% на% date: ~ 6,4% -% date: ~ 3,2% -% date: ~ 0,2% сработало
MagTun

Ответы:

28

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

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

@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 /?в командной строке или перейдите на эту страницу .

Каран
источник
Спасибо, я думаю, я понимаю, как это работает сейчас. Я не нахожусь в офисе, но попробую это, как только я доберусь туда и отправлю назад. Мы используем Windows 8 Спасибо за помощь
guyfromfl
Понял, пришлось подправить строковые местоположения даты, вероятно из-за моего местоположения и языка, но это сработало! Большое спасибо!
guyfromfl
Чтобы получить независимую от локали дату, используйте вместо
нее
Это решение может дать вам разные результаты на разных машинах.
Мехди Дехгани
Я думаю, что что-то изменилось с выходом даты, я получаю > echo yyyy = %DATE:~6,4%производить yyyy = /20/. Однако echo yyyy = %DATE:~10,4%есть yyyy = 2019.
teeks99
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
Abbs
источник
3
Добро пожаловать в Супер пользователя! Не могли бы вы отредактировать свой ответ, чтобы включить некоторые объяснения того, что делают ваши команды?
Excellll
Вы отвечаете не на тот вопрос. Вопрос ОП требует ГГГГММДД; этот ответ дает ММДДГГГГ.
Скотт
нет ничего лучше, чем прийти к Стэку с вопросом и получить идеальный ответ, просто сидеть и ждать, чтобы спасти мне день. Большое спасибо @abbs и Excelll
часовой стрелке
3

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

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

Андре Вервийс
источник
Чем это отличается от других ответов?
Подозреваемый
@suspectus: Этот ответ отличается от ответа abbs тем, что abbs предполагает регион США (т. е. локаль), где %DATE%~ Ddd MM/DD/YYYY, тогда как этот предполагает не регион США, где %DATE%~ DD/MM/YYYY(без дня недели). И этот ответ отличается от ответа Карана тем, что этот вопрос неправильный - вопрос задает ГГГГММДД; этот ответ дает DD_MM – YYYY.
Скотт
2

Извините за задержку ...

Единственный надежный способ получить соответствующую дату независимо от региональных настроек - это решение 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
Эрик Оуэлл
источник
1

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

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

также я хотел ведущий ноль в час. «echo -! ^ _ 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"
Ник Роджерс
источник