我正在尝试创建一个日志文件,其中包含批处理文件中发生的事件的时间戳。
从下面的代码可以看出,在编写批处理文件方面我不是专家。尽管技术很差,但该过程仍能正常工作。为了防止批处理文件自行删除,我将其设置为只读。我会在某个时候弄清楚如何排除批处理文件。现在这并不重要。
@echo off
echo Compressing Files...
echo Compression Batch File STARTED: %date% %time% >> c:\temp\backup-compress.log
echo --------------------------------------------- >> c:\temp\backup-compress.log
for %%X in (*) do (
"c:\Program Files\7-Zip\7z.exe" a -tgzip "%%X.gz" "%%X"
echo %%X Compressed: %date% %time:~-11,8% >> c:\temp\backup-compress.log
echo Deleting: %%X
del "%%X"
echo %%X Deleted: %date% %time:~-11,8% >> c:\temp\backup-compress.log
)
echo Moving compressed copies to Compressed Backups folder...
move *.gz "Compressed Backups\" > NUL
echo --------------------------------------------- >> c:\temp\backup-compress.log
echo Compression Batch File FINSHED: %date% %time% >> c:\temp\backup-compress.log
echo Compression completed successfully...
echo
生成的日志文件看起来完全符合我的要求,但是,时间戳和日期在整个日志中保持不变。当批处理文件中发生事件时,我没有更新时间戳,而是只看到批处理文件启动的时间和日期,而不是每个 %time% 和 %date% 实例。
如何更正此问题并查看我正在创建的日志文件的正确时间和日期戳?
PS:请原谅我这篇文章的篇幅以及可能需要解决的简单问题。另外,如果标签不太正确,我深表歉意,这是我第一次真正发布问题,尽管该网站一直是一个很好的答案资源。
最佳答案
这是因为 cmd
在语句被解析 时展开变量,而不是直接在执行之前。这种情况下的语句是完整的 for
,包括它后面的 block 。因此,for
循环中保留的只是文字字符串,没有变量。
您可以使用延迟扩展来解决此问题。将以下内容放在批处理的开头:
setlocal enabledelayedexpansion
然后在循环中使用 !date!
和 !time!
。这将在执行语句之前扩展变量,因此将按预期工作。
关于windows - 正确地为批处理脚本创建的日志文件加上时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11422182/