在批处理文件中使用日期和时间创建文件名

在批处理文件中使用日期和时间创建文件名

我正在从批处理文件运行一个程序,该程序完成后会自动备份我的 MySQL 数据库。

我希望批处理文件为每次运行创建不同的备份,以便我可以回溯。

所需的文件名是 gnucash_shockwave-20121128210344.sql(日期格式为 YYYY-MM-DD-HH-MM-SS)

我已经在 Google 上搜索了一些内容,尝试一下%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!

有什么建议么?

答案1

日期和时间格式取决于您在地区和语言控制面板小程序。

运行以下批处理文件(假设日/月/年时:分:秒) 并根据需要修改子字符串提取(使用 : 和 ~ 字符)以从日期和时间字符串中获取正确的部分:

@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 /?在命令提示符下键入或参阅这一页

答案2

以下是对我有用的方法。

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

抱歉耽搁了...

无论区域设置如何,获取适当日期的唯一可靠方法是使用 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

答案4

我认为这稍微改善了@Nick Rogers 的回答。

例如:使用德语定位(de_DE)时,在 10 小时以下有一个前导空格。

我还想在小时前面加一个零。“echo - !^_hh! -”给出的是“09”,而不是只有“9”

因此,为了便于阅读,我将代码分成两部分。此示例应该匹配更多语言环境。

+bonus:_ms = 毫秒或最后两位数字 (-;

备注:有时 HOUR 需要转义,请参见内部代码

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

相关内容