用批处理脚本中的时间戳生成唯一的文件名

在我的.bat文件中,我想根据date时间为文件/目录生成一个唯一的名称。

例如

Build-2009-10-29-10-59-00 

问题在于%TIME%不会执行,因为它包含文件名非法的字符(例如':')。

batch file中是否有像'tr'的东西?

任何其他的想法如何解决这个问题(除了批解释器不需要额外的命令行工具)?

编辑:这样做的一个更好的方法是采取日期/时间字符串具有已定义的和不变的格式,而不是使用从%date%%time%的区域设置的格式。 您可以使用以下来获得它:

 for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined mydate set mydate=%%x 

它产生类似于20120730203126.530000+120东西,你可以用它来构造你的文件名。


(老答案在下面)

您可以简单地用空字符串替换违规字符:

 echo %time::=% 

语法%var:str1=str2%接受环境变量(如果是%TIME% ,则为伪变量),并用str2替换str1 。如果在等号str2没有任何str1则简单地删除str1

在你的具体情况下,我想你会想要以下几点:

 rem cut off fractional seconds set t=%time:~0,8% rem replace colons with dashes set t=%t::=-% set FileName=Build-%date%-%t% 

如果您不知道是否使用了冒号(但时间顺序相同),则采用更加暴力的方式:

 set FileName=Build-%date%-%time:~0,2%-%time:~3,2%-%time:~6,2% 

所有前面的事情,然而,假设您使用标准的ISO 8601日期格式,即。 2009-10-29。 我认为这只是正常的,但有些人使用其他格式,所以要小心。 但是因为你没有问我假设的日期,所以你没有问题。

跟随@乔伊和@ Kees的答案,使他们立即可用。

在命令行上:

 FOR /f %a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%a SET DateTime=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%_%DTS:~8,2%-%DTS:~10,2%-%DTS:~12,2% echo %DateTime% 

在一个BAT文件中:

 @echo off REM See http://stackoverflow.com/q/1642677/1143274 FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a SET DateTime=%DTS:~0,4%-%DTS:~4,2%-%DTS:~6,2%_%DTS:~8,2%-%DTS:~10,2%-%DTS:~12,2% echo %DateTime% 

示例输出:

 2014-10-21_16-28-52 

我用它来创建一个唯一的文件名来执行批处理文件。

 REM ****Set up Logging **** For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b) For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b) set mytime=%mytime: =0% set Logname="PCCU_%mydate%_%mytime%.log" Echo. >>%Logname% 2>>&1 Echo.=================== >>%Logname% 2>>&1 

我不得不添加该行

 set mytime=%mytime: =0% 

因为我在上午10点之前输入了一个空格,所以现在我得到了09而不是9。我还将%mydate%和%mytime%变量用于通过此脚本创建的其他文件,以便它们都具有相同的日期时间戳。

这个例程,实际上只有一行,适用于任何日期或时间格式的系统。
第1行的输出格式为20140725095527.710000 + 120

您需要的实际日期/时间格式在第2行中确定。您可以根据需要对其进行格式化。
只需将结果DateTime变量添加到您的文件名即。 Filename_%的DateTime%.LOG

 ::======================================================================= ::== CREATE UNIQUE DateTime STRING IN FORMAT YYYYMMDD-HHMMSS ::======================================================================= FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a SET DateTime=%DTS:~0,8%-%DTS:~8,6% | REM OUTPUT = 20140725-095527 

为了使前面的例子中的代码工作,我需要稍微调整。 我想这是因为我的电脑使用英国的日期格式。 在mydate中取回“2014-04-19”我需要:

 For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a) 

下面我粘贴了我的总脚本,并包含了如何使用文件名的例子

 For /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%b-%%a) For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set mytime=%%a%%b) set mytime=%mytime: =0% set Logname="c:\temp\LogFiles\MyLogFile_%mydate%_%mytime%.log" Robocopy \\sourceserver\Music H:\MyBackups\Music /MIR /FFT /Z /XA:H /W:5 /np /fp /dcopy:T /unilog:%Logname% /tee 

希望这可以帮助!

如果您可以保证机器上安装了特定版本的Python,并且可以在系统的PATH访问,则可以使用以下解决方案:

 FOR /F "tokens=* USEBACKQ" %%F IN (`python -c "import datetime; print datetime.datetime.now().replace(microsecond=0).isoformat().replace(':', '-')"`) DO ( SET TIMESTAMP=%%F ) ECHO %TIMESTAMP% 

这将把当前的本地ISO-8601 (ISH)日期表示放入一个%TIMESTAMP%变量中,并将其回显出来,如下所示:

 2017-05-25T14:54:37 

我在isoformat() replace(':', '-')之后放置了replace(':', '-') ,以便可以在文件名或目录中使用结果字符串,因为:是Windows文件系统中的禁用字符。