在我的.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文件系统中的禁用字符。