在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

当前回答

我今天遇到了这个问题,并解决了它:

SET LOGTIME=%TIME: =0%

它用0代替空格,基本上是零垫小时。

经过一些快速搜索,我没有发现它是否需要命令扩展(仍然使用SETLOCAL DISABLEEXTENSIONS)。

其他回答

如果安装了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)。

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

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

您将在此链接中找到关于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

还有另一种简单的方法:

set HH=%time:~0,2%
if %HH% LEQ 9 (
set HH=%time:~1,1%
)