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

Ass*_*vie 37 windows filenames timestamp batch-file

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

例如

Build-2009-10-29-10-59-00
Run Code Online (Sandbox Code Playgroud)

问题是%TIME%不会这样做,因为它包含文件名中非法的字符(例如:).

tr批处理文件中有类似的东西吗?

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

Joe*_*oey 43

编辑:更好的方法是采用具有已定义和不变格式的日期/时间字符串,而不是使用来自%date%和的语言环境定义的字符串%time%.您可以使用以下内容来获取它:

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

它产生类似的东西20120730203126.530000+120,您可以使用它来构建您的文件名.


(旧答案如下)

您可以简单地用空字符串替换有问题的字符:

echo %time::=%
Run Code Online (Sandbox Code Playgroud)

语法%var:str1=str2%采用环境变量(或者用于%TIME%替换str1的伪变量str2.如果在等号后面没有任何内容,str1则简单地删除.

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

rem cut off fractional seconds
set t=%time:~0,8%
rem replace colons with dashes
set t=%t::=-%
set FileName=Build-%date%-%t%
Run Code Online (Sandbox Code Playgroud)

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

set FileName=Build-%date%-%time:~0,2%-%time:~3,2%-%time:~6,2%
Run Code Online (Sandbox Code Playgroud)

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

  • 对于试图将代码复制/粘贴到命令提示符并出现错误的任何其他人,解决方案是在两个位置将"%%"更改为"%".原始代码在批处理文件中工作,但不在命令行中. (4认同)
  • 就像我说的那样,这假设您为系统使用了合理的日期/时间格式。如果未定义mydate set mydate = %% x,则可以使用'for / f“ skip = 1” %% x('wmic os get localdatetime')做。mydate中的日期/时间格式不会更改,始终为YYYYMMDDHHMMSS ...,您可以根据自己的喜好进行裁剪。 (2认同)

Evg*_*eev 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%
Run Code Online (Sandbox Code Playgroud)

在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%
Run Code Online (Sandbox Code Playgroud)

示例输出:

2014-10-21_16-28-52
Run Code Online (Sandbox Code Playgroud)