用于循环的批处理文件解压缩文件并获取zip文件内容的时间戳

时间:2012-07-19 12:29:52

标签: command-line batch-file

我有一个每日进程,可以从其他进程创建的文件中生成一些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%
)

该文件应该做的简短摘要:

  1. 遍历C:\ Test \ VersionX \ directory
  2. 中的每个模式* .zip文件
  3. 将此文件解压缩到%temp%\ %% f目录(其中%% f是文件名)
  4. 获取%temp%\ %% f \ InstallScript.xml的时间戳并将其放入%InstallScriptXMLDate%变量
  5. 删除%temp%\ %% f目录
  6. 将文件名(%% f)和时间戳(%InstallScriptXMLDate%)回显到日志文件中
  7. 截至目前,日志文件只包含文件名,后跟字符串'[package from]'字符串,但缺少实际日期时间戳

    zip文件的解压缩和删除工作完美无缺,它只是没有设置的时间戳。

1 个答案:

答案 0 :(得分:3)

您正在设置变量并在同一个块中使用它。这在cmd中不起作用,因为当语句解析时而不是在执行时,环境变量会被扩展。因此,当循环运行时,所有变量都已被循环前的值替换。

setlocal enabledelayedexpansion

在批处理开始时使用!InstallScriptXmlDate!代替%InstallScriptXmlDate%

另一个注意事项:for完全能够自行迭代文件,您几乎不需要使用dir /b迭代for /f输出。事实上,它可以引入可以通过

避免的问题
for %%f in (%VersionDirectory%\Installable\Packages\pattern*.zip)