在我的.bat文件我想要生成基于日期,时间的文件/目录的唯一名称。
如
Build-2009-10-29-10-59-00
问题是, %TIME%
不会做,因为它包含在文件名非法字符(例如:
)。
有什么样tr
在批处理文件?
任何其他的想法如何解决这个问题(即不从批量解释需要额外的命令行实用程序除外)?
在我的.bat文件我想要生成基于日期,时间的文件/目录的唯一名称。
如
Build-2009-10-29-10-59-00
问题是, %TIME%
不会做,因为它包含在文件名非法字符(例如:
)。
有什么样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%
并取代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%
更强力的方式的情况下,你不知道是否使用冒号(但时间顺序将是相同的):
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行确定的,但是你想你可以对其进行格式化。
刚刚得到的日期时间变量添加到您的文件名,即。 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
我做了这个普遍的,在任何环境中的日期格式可能不同会工作。
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
要在前面的例子中工作的代码,我需要稍微调整。 我相信这是因为我的电脑是使用英国的日期格式。 要回到“2014年4月19日” 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
希望这可以帮助!
如果你能保证该机拥有的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%
变量和echo出来,像这样:
2017-05-25T14:54:37
我已经把replace(':', '-')
后isoformat()
这样得到的字符串可以在文件名或目录被使用,因为:
在Windows文件系统中被禁止的字符。