command-line - 批处理文件 for 循环解压缩文件并获取 zip 文件内容的时间戳

标签 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\目录中的每个pattern*.zip 文件
  2. 将此文件解压缩到 %temp%\%%f 目录(其中 %%f 是文件名)
  3. 获取 %temp%\%%f\InstallScript.xml 的时间戳并将其放入 %InstallScriptXMLDate% 变量
  4. 删除 %temp%\%%f 目录
  5. 将文件名 (%%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/

相关文章:

windows - 从批处理文件中终止 Windows 16 位进程

batch-file - 如何使用 xcopy 排除特定文件被复制

java - 批处理文件在执行 Java 程序后立即终止(如果从另一个 Java 程序调用批处理文件)

hadoop - 检查HDFS目录大小的方法?

perl - 如何将在另一个Perl脚本中执行的Perl脚本的输出重定向到文件?

command-line - zsh:找不到命令:gulp

windows - 从exe生成的bat文件中的bash -c不是命令

command-line - MSBuild/cmd 任务 "was unexpected at this time"

mysql - "chown mysql:mysql/data/tmp"命令

javascript - 在批处理文件中使用 JSMin