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

Windows 在批处理脚本中生成带有时间戳的唯一文件名,windows,batch-file,timestamp,filenames,Windows,Batch File,Timestamp,Filenames,在我的.bat文件中,我想根据日期和时间为文件/目录生成一个唯一的名称 e、 g 问题是,%TIME%不起作用,因为它包含文件名中非法的字符(例如,:) 批处理文件中是否有类似的内容 如何解决这个问题(除了批处理解释器之外,不需要额外的命令行实用程序)还有其他想法吗?编辑:一个更好的方法是获取一个具有已定义且不变格式的日期/时间字符串,而不是使用%date%和%time%中的区域设置定义的格式。您可以使用以下方法来获取它: for /f "skip=1" %%x in ('wmic os get

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

e、 g

问题是,
%TIME%
不起作用,因为它包含文件名中非法的字符(例如,

批处理文件中是否有类似的内容


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

编辑:一个更好的方法是获取一个具有已定义且不变格式的日期/时间字符串,而不是使用
%date%
%time%
中的区域设置定义的格式。您可以使用以下方法来获取它:

for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined mydate set mydate=%%x
它会产生类似于
2012073023126.530000+120
的结果,您可以使用它来构造文件名


(旧答案如下)

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

echo %time::=%
语法
%var:str1=str2%
采用环境变量(或在
%TIME%
的情况下采用伪变量),并用
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%
如果您不知道是否使用冒号(但时间顺序是相同的),可以使用更为暴力的方式:


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

我使用它为执行bat创建一个唯一的文件名ch文件

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%变量,以便它们都具有相同的日期时间戳。

要使上一个示例中的代码正常工作,我需要稍微调整一下。我假定因为我的电脑使用的是英国日期格式。要在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 

希望这能有所帮助!

此例程实际上只有一行,适用于设置为任何日期或时间格式的每个系统。
第1行的输出格式为20140725095527.710000+120

您需要的实际日期/时间格式在第2行中确定。您可以根据需要进行格式设置。
只需将生成的DateTime变量添加到文件名中,即.filename\uU%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

跟进@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
如果可以保证机器上安装了特定版本的Python,并且可以在系统的
路径中访问,则可以使用以下解决方案:

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%
这会将当前本地(ish)日期表示形式放入
%TIMESTAMP%
变量中,并将其回显,如下所示:

2017-05-25T14:54:37

我将
replace(“:”,“-”)
放在
isoformat()
之后,这样就可以在文件名或目录中使用生成的字符串,因为
是Windows文件系统中的禁用字符。

我将此设置为通用,可以在日期格式可能不同的任何环境中使用

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
echo关闭
如果不存在“C:\SWLOG\”mkdir C:\SWLOG
cd C:\SWLOG\
cmd/c“powershell获取日期-格式^”{yyyyMMdd HHmmss}^“>result.txt
REM echo%time%>result.txt
键入result.txt>result1.txt

set/p filename=%time:~0,2%-%time:~3,2%-%time:~6,2%在上午10:00AM之前创建一个带空格的字符串!正如我所说,这假设您的系统使用了一种合理的日期/时间格式。您可以在('wmic os get localdatetime')中为/f“skip=1”%%x使用
如果未定义mydate,请不要设置mydate=%%x
mydate
中的日期/时间格式不会更改,它始终是
YYYYMMDDHHMMSS…
,您可以根据自己的喜好对其进行剪切。对于试图将代码复制/粘贴到命令提示符中并出现错误的任何其他人,解决方案是将“%”更改为“%”原始代码在批处理文件中工作,但不在命令行中。
2017-05-25T14:54:37
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