在我的.bat文件中,我想根据日期时间为文件/目录生成一个唯一的名称。
e.g。
Build-2009-10-29-10-59-00
问题在于%TIME%
不会这样做,因为它包含非法文字名称(例如 :
)。
批处理文件中是否有类似tr
的内容?
如何解决此问题的任何其他想法(除了批处理解释器之外不需要额外的命令行实用程序)?
答案 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文件系统中的禁用字符。