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


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.