使用批处理文件准确记录日期和时间

使用批处理文件准确记录日期和时间

我有一个批处理文件,可以备份我的文件并且运行良好,但是我希望能够记录每个任务启动的确切时间,但它没有按我预期的方式工作。

@echo off
> C:\log\%date:~3,2%-%date:~0,2%.log (
echo %time% - Backing up first part
... some logic
echo %time% - Backing up second part
... 
)

问题是我对 %time% 的两个实例获得了完全相同的时间,而不是像我想要的那样显示准确的时间。

我认为这与延迟扩展有关,也许 DOS 第一次为时间分配一个值并在整个文件中保留该值。

我该怎么做才能反映出回声实际被调用的时间?

答案1

经典的延迟扩展问题。

您的问题是,%time%在解析语句时发生扩展,并且在执行任何命令之前同时解析整个括号内的块。

有三种可能的解决方案:

1)TIME /T改用

这样就避免了扩展时间的问题。但是格式不同,时间后面有一个换行符,所以不能在末尾添加标签。

time /t
echo Backing up first part

如果您希望标签在同一行,那么您可以反转顺序并使用 SET /P

<nul set /p "Backing up first part - "
time /t

或者你可以用 FOR /F 循环捕获输出并将所有内容放在一行上

for /f "delims=" %%T in ('time /t') do echo %%T - Backing up first part:

2)使用 CALL 和双倍百分比来获得额外一轮解析

call echo %%time%% - Backing up first part:

Windows 命令解释器(CMD.EXE)如何解析脚本?了解其工作原理。第 1 阶段和第 6 阶段与此相关。但请注意 - 其中包含大量非常密集的材料,需要时间来消化。

3)使用延迟扩展

这是我喜欢使用的技术。

这比 CALL hack 快得多。它需要 SETLOCAL 来启用延迟扩展,并使用!而不是%来扩展变量:

setlocal enableDelayedExpansion
> C:\log\%date:~3,2%-%date:~0,2%.log (
  echo !time! - Backing up first part
  ... some logic
  echo !time! - Backing up second part
  ... 
)

相关内容