【问题标题】:Batch file for loop to unzip files and get timestamps of zip file contents循环批处理文件以解压缩文件并获取 zip 文件内容的时间戳
【发布时间】:2012-07-19 20:32:10
【问题描述】:

我有一个日常流程,它会从其他流程创建的文件中生成一些 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\ 目录中的每个 pattern*.zip 文件
  2. 将此文件解压缩到 %temp%\%%f 目录(其中 %%f 是文件名)
  3. 获取 %temp%\%%f\InstallScript.xml 的时间戳并将其放入 %InstallScriptXMLDate% 变量中
  4. 删除 %temp%\%%f 目录
  5. 将文件名 (%%f) 和时间戳 (%InstallScriptXMLDate%) 回显到日志文件中

到目前为止,日志文件只包含文件名,后跟字符串 '[package from ]' 字符串,但缺少实际的日期时间戳

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

【问题讨论】:

    标签: command-line batch-file


    【解决方案1】:

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

    setlocal enabledelayedexpansion
    

    在批处理开始时使用!InstallScriptXmlDate! 而不是%InstallScriptXmlDate%

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

    for %%f in (%VersionDirectory%\Installable\Packages\pattern*.zip)
    

    【讨论】:

    • 谢谢!通过删除 for 循环中的 dir /b 命令解决了我的问题并改进了我的脚本!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2014-04-19
    • 1970-01-01
    相关资源
    最近更新 更多