windows - 正确地为批处理脚本创建的日志文件加上时间戳

标签 windows batch-file timestamp

我正在尝试创建一个日志文件,其中包含批处理文件中发生的事件的时间戳。

从下面的代码可以看出,在编写批处理文件方面我不是专家。尽管技术很差,但该过程仍能正常工作。为了防止批处理文件自行删除,我将其设置为只读。我会在某个时候弄清楚如何排除批处理文件。现在这并不重要。

@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/

相关文章:

linux - 将多个命令的输出重定向到单个文件

windows - 为什么我的批处理脚本在 if 语句匹配时同时运行 if 和 else 语句?

java - 如何在 Java 中将 YMD LDAP 时间戳转换为日期时间?

c++ - UTC 时间戳比较

c++ - 注入(inject) DLL 时,Explorer.exe 在启动时死锁

windows - 为什么Windows中安装的git bash在后台运行脚本?

windows - 如何抑制 RD 确认

mysql - 如何为 MySQL 变量设置时间戳?

windows - 修复多次鼠标中键点击

windows - 需要通过 GSSAPI 为 svn/svnserve 身份验证确定正确的 SPN 以赢得 2008 AD