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

Lui*_*dMx 2 windows batch ms-dos

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

@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
... 
)
Run Code Online (Sandbox Code Playgroud)

问题是我为 %time% 的两个实例获得了完全相同的时间,而不是按照我想要的方式显示确切的时间。

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

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

dbe*_*ham 6

经典的延迟扩展问题。

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

有三种可能的解决方案:

1)TIME /T改用

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

time /t
echo Backing up first part
Run Code Online (Sandbox Code Playgroud)

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

<nul set /p "Backing up first part - "
time /t
Run Code Online (Sandbox Code Playgroud)

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

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

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

call echo %%time%% - Backing up first part:
Run Code Online (Sandbox Code Playgroud)

请参阅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
  ... 
)
Run Code Online (Sandbox Code Playgroud)