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

时间:2009-10-29 10:09:16

标签: windows batch-file timestamp filenames

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

e.g。

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

问题在于%TIME%不会这样做,因为它包含非法文字名称(例如 : )。

批处理文件中是否有类似tr的内容?

如何解决此问题的任何其他想法(除了批处理解释器之外不需要额外的命令行实用程序)?

7 个答案:

答案 0 :(得分:42)

编辑:更好的方法是采用具有已定义且不变的格式的日期/时间字符串,而不是使用%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%的情况下的伪变量,并将str1替换为str2。如果等号后面没有任何内容,则{只需删除{1}}。

在您的具体情况下,我认为您需要以下内容:

str1

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

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

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

答案 1 :(得分:17)

跟进@ Joey和@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

答案 2 :(得分:3)

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

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%变量用于我使用此脚本创建的其他文件,以便它们都有相同的日期时间戳。

答案 3 :(得分:2)

此例程实际上只有一行,适用于设置为任何日期或时间格式的每个系统 第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

答案 4 :(得分:2)

我实现了这种通用性,可以在日期格式可能不同的任何环境下工作。

echo off
if not exist "C:\SWLOG\" mkdir C:\SWLOG
cd C:\SWLOG\
cmd /c "powershell get-date -format ^"{yyyyMMdd-HHmmss}^""> result.txt
REM echo %time% > result.txt
type result.txt > result1.txt
set /p filename=<result1.txt
echo %filename%
del C:\SWLOG\result.txt
del C:\SWLOG\result1.txt

答案 5 :(得分:1)

为了使上一个示例中的代码有效,我需要稍微调整一下。我认为这是因为我的电脑使用的是英国日期格式。回来&#34; 2014-04-19&#34;在mydate我需要:

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 

希望这有帮助!

答案 6 :(得分:0)

如果您保证该机器上安装了特定版本的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

我已将replace(':', '-')放在isoformat()之后,以便生成的字符串可用于文件名或目录,因为:是Windows文件系统中的禁用字符。