Windows CMD批处理脚本中的文件名时间戳

我有一个批处理脚本输出一个文件,我试图确保每次脚本执行,没有现有的文件被覆盖,所以我试图把时间戳上。

目前我有这个:

set stamp=%DATE:/=-%_%TIME::=-% 

但是如果时间是凌晨1点到9点,它会给出类似于:

 13-06-2012_ instead of a full 13-06-2012_12-39-37.28 

我怎样才能解决这个问题?

我正在使用Windows 7,并且在命令行窗口中echo %date% %time%的输出是(我的'short date'的时钟格式被设置为显示3个字母的月份):

 03-Sep-12 9:06:21.54 

编辑:我一直在使用以下时间戳,现在很好,运作良好。

 set timestamp=%DATE:/=-%_%TIME::=-% set timestamp=%timestamp: =% 

它产生了一个时间戳,如: 18-03-2013_13-37-43.26 ,通过replace/:%TIME%%DATE% ,然后剥离空白。 空白是我原来的问题,真的是这个问题。

Solutions Collecting From Web of "Windows CMD批处理脚本中的文件名时间戳"

请参阅堆栈溢出问题如何获取Windows命令行上的当前日期时间,以适当的格式在文件名中使用?

创建一个文件date.bat

 @echo off For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b) For /f "tokens=1-3 delims=/:/ " %%a in ('time /t') do (set mytime=%%a-%%b-%%c) set mytime=%mytime: =% echo %mydate%_%mytime% 

运行date.bat

 C:\>date.bat 2012-06-14_12-47-PM 

更新:

你也可以用一行这样做:

for /f "tokens=2-8 delims=.:/ " %%a in ("%date% %time%") do set DateNtime=%%c-%%a-%%b_%%d-%%e-%%f.%%g

这个代码的前四行将使用WMIC为您提供XP Pro和更高版本中可靠的YY DD MM YYYY HH Min Sec变量。

 @echo off for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a" set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%" set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%" set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%" set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%" echo datestamp: "%datestamp%" echo timestamp: "%timestamp%" echo fullstamp: "%fullstamp%" pause 

这是我为了返回时间戳而创建的批处理脚本。 可以提供可选的第一个参数作为字段分隔符。 例如:

C:\ SYS \ TMP> timestamp.bat
20160404_144741
c:\ sys \ tmp> timestamp.bat –
2016-04-04_14-45-25
c:\ sys \ tmp> timestamp.bat:
2016年04:04_14:45:29

 @echo off SETLOCAL ENABLEDELAYEDEXPANSION :: put your desired field delimiter here. :: for example, setting DELIMITER to a hyphen will separate fields like so: :: yyyy-MM-dd_hh-mm-ss :: :: setting DELIMITER to nothing will output like so: :: yyyyMMdd_hhmmss :: SET DELIMITER=%1 SET DATESTRING=%date:~-4,4%%DELIMITER%%date:~-7,2%%DELIMITER%%date:~-10,2% SET TIMESTRING=%TIME% ::TRIM OFF the LAST 3 characters of TIMESTRING, which is the decimal point and hundredths of a second set TIMESTRING=%TIMESTRING:~0,-3% :: Replace colons from TIMESTRING with DELIMITER SET TIMESTRING=%TIMESTRING::=!DELIMITER!% :: if there is a preceeding space substitute with a zero echo %DATESTRING%_%TIMESTRING: =0% 

它想在DD-MM-YYYY_HH-MM-SS.TT的全职时间TT是滴答。 例外说明了这一切。

 for /f "tokens=2-8 delims=.:/ " %%a in ("%date% %time: =0%") do set DateNtime=%%c-%%a-%%b_%%d-%%e-%%f.%%g echo %DateNtime% 

或者,从命令行:

 for /f "tokens=2-8 delims=.:/ " %a in ("%date% %time: =0%") do echo %c-%a-%b_%d-%e-%f.%g 

编辑:根据bryce的非标准时间/日期规格。 ( 03-Sep-12 9:06:21.54

 @echo off setlocal enabledelayedexpansion for /f "tokens=1-7 delims=.:/- " %%a in ("%date% %time%") do ( if "%%b"=="Jan" set MM=01 if "%%b"=="Feb" set MM=02 if "%%b"=="Mar" set MM=03 if "%%b"=="Apr" set MM=04 if "%%b"=="May" set MM=05 if "%%b"=="Jun" set MM=06 if "%%b"=="Jul" set MM=07 if "%%b"=="Aug" set MM=08 if "%%b"=="Sep" set MM=09 if "%%b"=="Oct" set MM=10 if "%%b"=="Nov" set MM=11 if "%%b"=="Dec" set MM=12 set HH=0%%d set HH=!HH:~-2! echo 20%%c-!MM!-%%a_!HH!-%%e-%%f.%%g ) endlocal 

感谢Stack Overflow问题的答案在批处理作业中创建文件名作为时间戳 ,我发现它是一个终止文件名的空间。

在过去,我使用了我在Internet上找到的.cmd脚本。 我讨厌本地化通常与日期混淆的方式。 任何时候你有文件名的日期(或其他地方,如果我可能是如此大胆),我想你想要他们在ISO 8601格式:

2015-02-19T14:54:51Z

或者按照YMDHM顺序排列的其他东西,比如

2015-02-19 14:54

因为它修复了MDY / DMY模糊性,因为它可以排序为文本。

我不知道哪里有.cmd脚本,但它可能是http://ss64.com/nt/syntax-getdate.html ,它在我的YYYY-MM-DD Windows 8.1和M / D / YYYY Windows 7的安装。两者都给出相同的格式:

2015-02-09 04:43