我正在尝试创建一个日志文件,其中包含正在批处理文件中发生的事件的时间戳。
从下面的代码中可以看出,在编写批处理文件时,我不是专家。尽管技术很差,但这个过程仍然可行。为了防止批处理文件自身删除,我将其设置为只读。我将解决如何在某些时候排除批处理文件。现在,这并不重要。
@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:请原谅我这篇文章的篇幅,这可能是一个简单的问题需要解决。此外,如果标签不太正确,我道歉,这是我第一次真正发布一个问题,虽然该网站一直是一个很好的答案资源。
答案 0 :(得分:4)
这是因为cmd
在执行解析语句时不会直接扩展变量。在这种情况下的一个陈述是完整的for
,包括它之后的块。所以保留在for
循环中的只是文字字符串,没有变量。
您可以使用延迟扩展来解决问题。将以下内容放在批处理的开头:
setlocal enabledelayedexpansion
然后在循环中使用!date!
和!time!
。这将在执行语句之前扩展变量,从而按预期工作。
答案 1 :(得分:0)
我使用一种不同的方法来获得适当的时间,因为我不关心毫秒。
我像这样设定时间:
FOR /F %%A IN ('TIME/T') DO SET timeEdit=%%A
ECHO %timeEdit%
这样我就可以按照我想要的方式获得时间,唯一的缺点就是这比setlocal方法要长一些。如果你想多次捕获,你需要两条线,因为你很难为时间设置一个变量,而不是实时从系统中捕获时间。