在Windows (Windows XP)批处理脚本中,我需要格式化当前日期和时间,以便以后在文件名等中使用。

这类似于堆栈溢出问题如何在批处理文件中添加日期,但也包含时间。

到目前为止,我有这个:

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

当前回答

下面是如何生成一个日志文件名(基于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)。基本上,我将子字符串连接起来,最后将所有空格替换为零。

结果字符串的格式为:yyyy_mm_dd__hh_mm_ss


子字符串如何工作的简短解释:

%VARIABLE:~num_chars_to_skip,num_chars_to_keep%

因此,要想从“29.03.2018”这样的日期中得到年份,可以使用:

%DATE:~6,4%
       ^-----skip 6 characters
         ^---keep 4 characters 

如前所述,只有在您知道当前用户使用的格式(例如,MM/dd/yy或dd-MM-yyyy,仅举两个例子)时,解析日期和时间才有用。这是可以确定的,但是当您完成所有的强调和解析时,您仍然会遇到使用了意想不到的格式的情况,需要进行更多的调整。

您还可以使用一些外部程序,它们将以您喜欢的格式返回日期段,但这样做的缺点是需要将实用程序与脚本/批处理一起分发。

也有批处理技巧使用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

我是这样做的:

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

Windows中SET命令支持的offset:length格式将不允许您填充您似乎感兴趣的0。

但是,您可以编写一个BATCH脚本来检查小时是否小于10和 相应地用不同的回声字符串进行填充。

您将在此链接中找到关于SET命令的一些信息。


您还可以更改其他编程方法以达到此目的。

在unix bash (Windows上的Cygwin可用)中,只需说,

date +%Y_%m_%d__%H_%M_%S

它总是正确地填充。

为了在文件名中使用数字日期的一个非常简单的解决方案,请使用以下代码:

set month=%date:~4,2%
set day=%date:~7,2%
set curTimestamp=%month%%day%%year%

rem then the you can add a prefix and a file extension easily like this
echo updates%curTimestamp%.txt