2

我有一个日常进程,它会从其他进程创建的文件中生成一些 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文件的解压缩和删除工作完美无缺,只是没有设置时间戳。

4

1 回答 1

3

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

setlocal enabledelayedexpansion

在批次开始时使用,!InstallScriptXmlDate!而不是%InstallScriptXmlDate%.

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

for %%f in (%VersionDirectory%\Installable\Packages\pattern*.zip)
于 2012-07-19T12:32:10.473 回答