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 第一次为时间分配一个值,并将该值保留在整个文件中。
我应该怎么做才能反映实际调用回声的时间?
经典的延迟扩展问题。
您的问题是%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)