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


20

我正在从批处理文件运行程序,完成后该文件将自动备份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!

有什么建议么?


我已经重新关联了您的帐户,您现在应该可以登录并评论自己的帖子和问题的答案。
slhck

slhck,大声笑谢谢,我想知道发生了什么事,然后我才记得我不是堆栈溢出大声笑
guyfromfl 2012年

用%date:
〜6,4

Answers:


27

日期和时间格式取决于您在“ 区域和语言控制面板”小程序中指定的格式。

运行以下批处理文件(假定为dd / mm / yyyyhh:mm:ss),并根据需要修改子字符串提取(使用:和〜字符),以从Date和Time字符串中获取适当的部分:

@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 2012年

知道了,不得不调整日期的字符串位置,可能是因为我的位置和语言,但这确实成功了!非常感谢你!
guyfromfl 2012年

要获得语言环境无关日期使用WMIC代替
phuclv

此解决方案可以在不同的计算机上提供不同的结果。
Mehdi Dehghani,

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 2015年

您在回答错误的问题。OP的问题要求YYYYMMDD;这个答案是MMDDYYYY。
斯科特

没有什么比带着问题来Stack有了完美的答案,只是坐在那里等待为我节省时间。非常感谢@abbs和Excelll
clockwiseq

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(没有星期几)。这与Karan的回答不同,这是错误的 -问题要求YYYYMMDD;此答案为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的回答。

例:德国位置(de_DE)在10点以下时有一个领先的空格。

我也希望每小时的前导零。“ echo-!^ _ hh!-”给出的是“ 09”,而不是“ 9”

所以我将代码分为两部分,以更好地阅读。此示例应匹配更多语言环境。

+奖金:_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


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"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.