微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

例如

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

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

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

Windows ImageMagick / bat删除部分名称

使用包含空格的文件名的GNUMake最可靠的方法是什么?

Shell脚本问题,包含空格的文件

在linux中追加date到文件

为什么所有名为win32的?

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

检查下划线是否包含除下划线和csv扩展名之外的任何有效的Windows文件名字符

.NET的安全/允许的文件名清理

使用BASH中的特殊字符从文件名中删除子string

如何处理Windows的ReadDirectoryChangesW()及其混合的长/短文件输出

在Windows下,如何读取最近加载的文件的特定path

编辑:这样做的一个更好的方法是采取日期/时间字符串具有已定义的和不变的格式,而不是使用从%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,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:tempLogFilesMyLogFile_%mydate%_%mytime%.log" Robocopy \sourceserverMusic H:MyBackupsMusic /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文件系统中的禁用字符。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐