在Windows(Windows XP)批处理脚本中,我需要格式化当前日期和时间,以便以后在文件名中使用等.
它类似于Stack Overflow问题如何在批处理文件中附加日期,但也有时间.
到目前为止我有这个:
echo %DATE% echo %TIME% set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2% echo %datetimef%
这使:
28/07/2009 8:35:31.01 2009_07_28__ 8_36_01
有没有办法允许%TIME%的单个数字小时,所以我可以得到以下内容?
2009_07_28__08_36_01
laurie.. 141
我最终得到了这个脚本:
set hour=%time:~0,2% if "%hour:~0,1%" == " " set hour=0%hour:~1,1% echo hour=%hour% set min=%time:~3,2% if "%min:~0,1%" == " " set min=0%min:~1,1% echo min=%min% set secs=%time:~6,2% if "%secs:~0,1%" == " " set secs=0%secs:~1,1% echo secs=%secs% set year=%date:~-4% echo year=%year%
::在WIN2008R2上,例如我需要让你的'set month =%date:~3,2%'如下所示::否则00为MONTH出现
set month=%date:~4,2% if "%month:~0,1%" == " " set month=0%month:~1,1% echo month=%month% set day=%date:~0,2% if "%day:~0,1%" == " " set day=0%day:~1,1% echo day=%day% set datetimef=%year%%month%%day%_%hour%%min%%secs% echo datetimef=%datetimef%
请注意将来谷歌的人(像我一样):这是依赖于语言环境的,因此可能需要调整才能在非英语Windows上运行! (45认同)
仅供参考,在Windows Server 2003和Windows 7上,此脚本为我提供了"201200Mo_085806"(正确的年份和时间). (11认同)
所有这一切都可以使用普通的字符串替换只需2行:http://stackoverflow.com/a/23558738/1879699 (5认同)
小智.. 70
@ECHO OFF : Sets the proper date and time stamp with 24Hr Time for log file naming : convention SET HOUR=%time:~0,2% SET dtStamp9=%date:~-4%%date:~4,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% SET dtStamp24=%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2% if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%) ECHO %dtStamp% PAUSE
%date%将为不同的语言环境提供不同的字符串. (7认同)
以下是它在Windows 7中提供的俄语语言环境.当前时间是2013-05-03T02:22:51,但脚本打印:"2013-5.-01_02_22_51" (3认同)
在Windows Server 2003和Windows 7上,这给了我正确的字符串.比我过去构建的要优雅得多,谢谢! (2认同)
将20146.0._173502返回给我(捷克语locale) (2认同)
win7 64bit终极,错误时间:20140.01_131612,必须(2014.10.26_131612) (2认同)
nightcoder.. 63
以下是我生成日志文件名的方法(基于http://ss64.com/nt/syntax-getdate.html):
@ECHO OFF :: Check WMIC is available WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error :: Use WMIC to retrieve date and time FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO ( IF "%%~L"=="" goto s_done Set _yyyy=%%L Set _mm=00%%J Set _dd=00%%G Set _hour=00%%H SET _minute=00%%I SET _second=00%%K ) :s_done :: Pad digits with leading zeros Set _mm=%_mm:~-2% Set _dd=%_dd:~-2% Set _hour=%_hour:~-2% Set _minute=%_minute:~-2% Set _second=%_second:~-2% Set logtimestamp=%_yyyy%-%_mm%-%_dd%_%_hour%_%_minute%_%_second% goto make_dump :s_error echo WMIC is not available, using default log filename Set logtimestamp=_ :make_dump set FILENAME=database_dump_%logtimestamp%.sql ...
有关批量中与区域设置无关的时间戳生成的问题,请参阅SO的最佳答案. (5认同)
真棒!应该有办法将此标记为解决方案 (2认同)
这似乎是最好的解决方案,谢谢 (2认同)
Andreas.. 42
每当我需要日期/时间字符串时,我通常会这样做:
set dt=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%__%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2% set dt=%dt: =0%
这是德国日期/时间格式(dd.mm.yyyy hh:mm:ss).基本上我连接子串并最终用零替换所有空格.
简短解释子串如何工作:
%VARIABLE:~num_chars_to_skip,num_chars_to_keep%
因此,从"29.03.2018"之类的日期开始,只需使用:
%DATE:~6,4% ^-----skip 6 characters ^---keep 4 characters
到目前为止,当您只需要一个干净的时间戳(没有空格或其他字符)时,这是最优雅的解决方案 (6认同)
G. Lombard.. 38
如果安装了PowerShell,那么您可以轻松可靠地以您想要的任何格式获取日期/时间,例如:
for /f %%a in ('powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%%a move "%oldfile%" "backup-%datetime%"
当然,现在总是安装PowerShell,但是在Windows XP上,如果您的批处理脚本在知道PS可用的已知环境中使用(或者如果PowerShell可用,则检查批处理文件),您可能只想使用此技术. ...)
您可以合理地问:如果您可以使用PowerShell来获取日期/时间,为什么要使用批处理文件,但我认为一些明显的原因是:(a)您不熟悉PowerShell并且仍然喜欢做大多数使用批处理文件的老式方法或(b)您正在更新旧脚本并且不希望将整个内容移植到PS.
我最终得到了这个脚本:
set hour=%time:~0,2% if "%hour:~0,1%" == " " set hour=0%hour:~1,1% echo hour=%hour% set min=%time:~3,2% if "%min:~0,1%" == " " set min=0%min:~1,1% echo min=%min% set secs=%time:~6,2% if "%secs:~0,1%" == " " set secs=0%secs:~1,1% echo secs=%secs% set year=%date:~-4% echo year=%year%
::在WIN2008R2上,例如我需要让你的'set month =%date:~3,2%'如下所示::否则00为MONTH出现
set month=%date:~4,2% if "%month:~0,1%" == " " set month=0%month:~1,1% echo month=%month% set day=%date:~0,2% if "%day:~0,1%" == " " set day=0%day:~1,1% echo day=%day% set datetimef=%year%%month%%day%_%hour%%min%%secs% echo datetimef=%datetimef%
@ECHO OFF : Sets the proper date and time stamp with 24Hr Time for log file naming : convention SET HOUR=%time:~0,2% SET dtStamp9=%date:~-4%%date:~4,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2% SET dtStamp24=%date:~-4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2% if "%HOUR:~0,1%" == " " (SET dtStamp=%dtStamp9%) else (SET dtStamp=%dtStamp24%) ECHO %dtStamp% PAUSE
以下是我生成日志文件名的方法(基于http://ss64.com/nt/syntax-getdate.html):
@ECHO OFF :: Check WMIC is available WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error :: Use WMIC to retrieve date and time FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO ( IF "%%~L"=="" goto s_done Set _yyyy=%%L Set _mm=00%%J Set _dd=00%%G Set _hour=00%%H SET _minute=00%%I SET _second=00%%K ) :s_done :: Pad digits with leading zeros Set _mm=%_mm:~-2% Set _dd=%_dd:~-2% Set _hour=%_hour:~-2% Set _minute=%_minute:~-2% Set _second=%_second:~-2% Set logtimestamp=%_yyyy%-%_mm%-%_dd%_%_hour%_%_minute%_%_second% goto make_dump :s_error echo WMIC is not available, using default log filename Set logtimestamp=_ :make_dump set FILENAME=database_dump_%logtimestamp%.sql ...
每当我需要日期/时间字符串时,我通常会这样做:
set dt=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%__%TIME:~0,2%_%TIME:~3,2%_%TIME:~6,2% set dt=%dt: =0%
这是德国日期/时间格式(dd.mm.yyyy hh:mm:ss).基本上我连接子串并最终用零替换所有空格.
简短解释子串如何工作:
%VARIABLE:~num_chars_to_skip,num_chars_to_keep%
因此,从"29.03.2018"之类的日期开始,只需使用:
%DATE:~6,4% ^-----skip 6 characters ^---keep 4 characters
如果安装了PowerShell,那么您可以轻松可靠地以您想要的任何格式获取日期/时间,例如:
for /f %%a in ('powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%%a move "%oldfile%" "backup-%datetime%"
当然,现在总是安装PowerShell,但是在Windows XP上,如果您的批处理脚本在知道PS可用的已知环境中使用(或者如果PowerShell可用,则检查批处理文件),您可能只想使用此技术. ...)
您可以合理地问:如果您可以使用PowerShell来获取日期/时间,为什么要使用批处理文件,但我认为一些明显的原因是:(a)您不熟悉PowerShell并且仍然喜欢做大多数使用批处理文件的老式方法或(b)您正在更新旧脚本并且不希望将整个内容移植到PS.
我今天遇到了这个问题并解决了它:
SET LOGTIME=%TIME: =0%
它用0替换空格,基本上是零填充小时.
经过一些快速搜索后,我没有发现它是否需要命令扩展(仍然使用SETLOCAL DISABLEEXTENSIONS).
如前所述,解析日期和时间仅在您知道当前用户使用的格式时才有用(例如,MM/dd/yy或dd-MM-yyyy仅命名为2).这可以确定,但是当你进行所有压力和解析时,你仍然会遇到一些使用了意外格式的情况,并且需要进行更多调整.
您还可以使用一些外部程序,它将以您的首选格式返回日期slug,但这样做的缺点是需要使用您的脚本/批处理分发实用程序.
还有一些以非常原始的方式使用CMOS时钟的批处理技巧,但对于大多数人来说,它太接近于裸线,并且也不总是检索日期/时间的首选位置.
以下是避免上述问题的解决方案.是的,它引入了一些其他问题,但出于我的目的,我发现这是在现代Windows系统的.bat文件中创建日期戳的最简单,最清晰,最便携的解决方案.这只是一个例子,但我想你会看到如何修改其他日期和/或时间格式等.
reg copy "HKCU\Control Panel\International" "HKCU\Control Panel\International-Temp" /f reg add "HKCU\Control Panel\International" /v sShortDate /d "yyMMdd" /f @REM reg query "HKCU\Control Panel\International" /v sShortDate set LogDate=%date% reg copy "HKCU\Control Panel\International-Temp" "HKCU\Control Panel\International" /f
以下可能不是一个直接的答案,而是一个接近的答案?
set hour=%time:~0,2% if "%hour:~0,1%" == " " set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__0%time:~1,2%_%time:~3,2%_%time:~6,2% else set datetimef=%date:~-4%_%date:~3,2%_%date:~0,2%__%time:~0,2%_%time:~3,2%_%time:~6,2%
至少它可能是鼓舞人心的.
如果您不完全需要这种格式:
2009_07_28__08_36_01
然后你可以使用以下3行代码,它们使用%date%和%time%:
set mydate=%date:/=% set mytime=%time::=% set mytimestamp=%mydate: =_%_%mytime:.=_%
注:字符/
和:
被删除,字符.
和空格替换为下划线.
示例输出(2015年5月8日星期三下午12:49,50秒和93毫秒):
echo %mytimestamp% Wed_08052015_124950_93
REM Assumes UK style date format for date environment variable (DD/MM/YYYY). REM Assumes times before 10:00:00 (10am) displayed padded with a space instead of a zero. REM If first character of time is a space (less than 1) then set DATETIME to: REM YYYY-MM-DD-0h-mm-ss REM Otherwise, set DATETIME to: REM YYYY-MM-DD-HH-mm-ss REM Year, month, day format provides better filename sorting (otherwise, days grouped REM together when sorted alphabetically). IF "%time:~0,1%" LSS "1" ( SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-0%time:~1,1%-%time:~3,2%-%time:~6,2% ) ELSE ( SET DATETIME=%date:~6,4%-%date:~3,2%-%date:~0,2%-%time:~0,2%-%time:~3,2%-%time:~6,2% ) ECHO %DATETIME%
Windows中offset:length
的SET
命令支持的格式将不允许您填充0
您似乎感兴趣的内容.
但是,您可以编写BATCH脚本以检查小于的小时数10
并
使用不同的echo
字符串进行相应的填充.
您可以在此链接上SET
找到有关该命令的一些信息.
你也可以改用其他编程方法来到这里.
unix bash(Windows上的Cygwin提供)非常简单,只是说,
date +%Y_%m_%d__%H_%M_%S
而且,它总是正确填充.
我是这样做的:
REM Generate FileName from date and time in format YYYYMMTTHHMM Time /T > Time.dat set /P ftime= < Time.dat set FileName=LogFile%date:~6%%date:~3,2%%date:~0,2%%ftime:~0,2%%ftime:~3,2%.log echo %FileName%
LogFile201310170928.log