Використання дати та часів у пакетному файлі для створення імені файлу


20

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

Я хотів би, щоб пакетний файл створив різну резервну копію для кожного запуску, щоб я міг зробити зворотній шлях.

Бажане ім'я файлу буде gnucash_shockwave-20121128210344.sql (формат дати РРРР-ММ-DD-HH-MM-SS)

Я гугл кілька речей , які вважають спробувати %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!

Будь-які пропозиції?


Я перезв’язував ваші акаунти, ви повинні мати можливість увійти та прокоментувати свої власні повідомлення та відповіді на свої запитання зараз.
— slhck

slhck, lol дякую, мені було цікаво, що відбувається тоді я згадав, що я не був у стеку переповнення lol
— guyfromfl

заміни% date% на% дата: ~ 6,4% -% дата: ~ 3,2% -% дата: ~ 0,2% відпрацьовано
— MagTun

Відповіді:


27

Формат дати та часу залежить від того, що ви вказали в аплеті панелі управління регіоном та мовою .

Запустіть наступний пакетний файл (який передбачає dd / mm / yyyy та hh: mm: ss ) та змініть вилучення підрядів (використовуючи символи: і ~), як це потрібно, щоб отримати належні частини з рядків дати та часу:

@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

Щоб отримати незалежну від місцевості дату, використовуйте wmic замість цього
— phuclv

Це рішення може дати вам різний результат на різних машинах.
— Мехді Дехгані

1
Я думаю, що щось змінилося з виходом дати, я можу > 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

3
Ласкаво просимо до Супер Користувача! Чи можете ви відредагувати свою відповідь, щоб включити пояснення того, що роблять ваші команди?
— Excellll

Ви відповідаєте на неправильне запитання. Питання ОП вимагає YYYYMMDD; цю відповідь дає MMDDYYYY.
— Скотт

нічого, як прийти до Стек із запитанням та отримати ідеальну відповідь, просто сидіти там, чекаючи, щоб врятувати мені день. Дякую @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(без дня тижня). І ця відповідь відрізняється від відповіді Карана тим, що ця помилкова - питання задає YYYYMMDD; ця відповідь дає DD_MM – РРРР.
— Скотт

2

Вибачте за затримку dthe ...

Єдиний надійний спосіб отримати відповідну дату незалежно від регіональних налаштувань - це рішення 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

Я думаю, що це трохи покращує відповідь Ніка Роджерса.

EX: з німецьким 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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.