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