我有一个日常进程,它从其他进程创建的文件中生成一些 zip 文件。我需要创建一个每日日志文件,该文件指示找到的每个 zip 文件的一个特定文件的内容的时间戳。
我创建了以下批处理脚本,该脚本昨天在我的测试系统上似乎有效,但今天不再有效,不知道为什么......
set VersionDirectory=C:\Test\VersionX\
set ResultOutputFile=C:\Test\LogFile.txt
for /f %%f in ('dir /b %VersionDirectory%\Installable\Packages\pattern*.zip') do (
mkdir %temp%\%%f\
unzip -extract -dir %VersionDirectory%\Installable\Packages\%%f %temp%\%%f\ > nul
for %%a in (%temp%\%%f\InstallScript.xml) do set InstallScriptXMLDate=%%~ta
rmdir /s /q %temp%\%%f\
echo %%f [package from %InstallScriptXMLDate%] >> %ResultOutputFile%
)
此文件应执行的操作的简短摘要:
- 循环遍历 C:\Test\VersionX\目录中的每个pattern*.zip 文件
- 将此文件解压缩到 %temp%\%%f 目录(其中 %%f 是文件名)
- 获取 %temp%\%%f\InstallScript.xml 的时间戳并将其放入 %InstallScriptXMLDate% 变量
- 删除 %temp%\%%f 目录
- 将文件名 (%%f) 和时间戳 (%InstallScriptXMLDate%) 回显到日志文件中
到目前为止,日志文件仅包含文件名,后跟字符串“[package from ]”字符串,但缺少实际日期时间戳
zip 文件的解压缩和删除工作正常,只是未设置时间戳。
最佳答案
您正在设置一个变量并在同一 block 中使用它。这在 cmd
中不起作用,因为环境变量是在语句被解析时扩展的,而不是在执行时扩展的。因此,当循环运行时,所有变量都已被替换为在循环之前的值。
放置
setlocal enabledelayedexpansion
在批处理开始时使用 !InstallScriptXmlDate!
而不是 %InstallScriptXmlDate%
。
另一个注意事项:for
完全能够自行迭代文件,您几乎不需要使用 for/f< 迭代
。事实上,它可能会带来一些可以避免的问题dir/b
输出
for %%f in (%VersionDirectory%\Installable\Packages\pattern*.zip)
关于command-line - 批处理文件 for 循环解压缩文件并获取 zip 文件内容的时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11560941/