3

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

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

@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:请原谅我这篇文章的篇幅以及可能要解决的简单问题。此外,如果标签不太正确,我很抱歉,这是我第一次实际发布问题,尽管该网站一直是一个很好的答案资源。

4

2 回答 2

4

这是因为cmd当语句不是在执行之前直接解析时会扩展变量。在这种情况下,语句是完整for的,包括它后面的块。所以for循环中剩下的都是文字字符串,没有变量。

您可以使用延迟扩展来纠正此问题。将以下内容放在批处理的开头:

setlocal enabledelayedexpansion

然后在循环中使用!date!and 。!time!这将在执行语句之前扩展变量,因此将按预期工作。

于 2012-07-10T21:24:37.167 回答
0

我使用一些不同的方法来获取正确的时间,因为我不关心毫秒。

我这样设置时间:

FOR /F %%A IN ('TIME/T') DO SET timeEdit=%%A
ECHO %timeEdit%

这样我得到了我想要的时间,唯一的缺点是这比 setlocal 方法长一点。如果您想多次捕获,则需要这两行,因为您正在为时间硬设置一个变量,而不是从系统中实时捕获时间。

于 2013-11-15T16:59:16.813 回答