【问题标题】:How can I unzip the newest file in a directory in a BAT file?如何解压缩 BAT 文件目录中的最新文件?
【发布时间】:2010-09-15 18:56:21
【问题描述】:

我正在开发一个构建系统。构建系统将结果以 zip 文件的形式发布到目录中。不幸的是,我没有简单的方法知道 zip 文件的名称,因为它带有时间戳。接下来的操作,我必须把这个 zip 文件解压到某个特定的位置,然后再做一些文件操作。

我想我可以更改构建系统,因此我从命令行指定结果 zip 文件的名称,但是,我认为找出哪个是最新文件并解压缩它可能是最简单的(如果前一个过程是成功的)。

如何发出仅对目录中最新的 zip 文件生效而忽略所有其他文件的解压缩命令?

编辑:我决定改用 ANT 中的功能来完成这项任务。但是,这仍然是一个巧妙的技巧......感谢您的回答!

【问题讨论】:

    标签: build-process batch-file unzip


    【解决方案1】:

    应该这样做:

    FOR /F usebackq %%i IN (`DIR /B /O-D *.ZIP`) DO UNZIP %%i && GOTO DONE || GOTO DONE
    :DONE
    

    它的工作原理如下:

    • DIR /B /O-D *.ZIP 以“裸”(即仅名称)格式以相反的日期顺序列出所有 ZIP 文件。
    • FOR /F usebackq 用于循环命令的输出。
    • && GOTO DONE || GOTO DONE 确保 UNZIP 仅针对第一个文件运行。您需要&&(和)和||(或),以防由于某种原因解压缩失败。

    您需要将UNZIP %%i 更改为您想要使用的任何解压缩命令。

    编辑 只要 Zip 文件名不包含任何空格,上述内容就可以工作。如果要处理带空格的文件名,请使用以下变体:

    FOR /F "tokens=*" %%i IN ('DIR /B /O-D *.ZIP') DO UNZIP "%%i" && GOTO DONE || GOTO DONE
    :DONE
    

    区别在于:

    • “tokens=*”选项返回整个文件名,即使它包含空格。

    • 传递给 UNZIP 的文件名被引用

    • 此变体对 DIR 命令使用单引号,因此不需要“usebackq”选项。

    【讨论】:

      【解决方案2】:

      如果 Cygwin 或其他类 Unix 环境是替代方案

      unzip "$(ls -tr *zip | tail -n1)"
      

      会做的

      【讨论】:

      • 您也可以下载unxutils.sourceforge.net 并将其添加到您的路径中,以便您在命令提示符下使用许多标准的 Unix 实用程序——这是我的 Windows 机器上的必备工具,以防我忘记dir vs. ls、cat vs. type 等。很高兴有 grep、awk 等。
      • 抱歉,正在更正最后一个链接——看起来他们已经移动了一些东西,要获取实际文件,您必须转到 sourceforge.net/projects/unxutils
      【解决方案3】:

      我认为您需要 7-zip 才能编写压缩/解压缩脚本。

      【讨论】:

        【解决方案4】:

        当您有 powershell 或控制台应用程序时,为什么要使用 bat 文件?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-07
          • 1970-01-01
          • 2016-12-28
          • 2015-12-26
          • 1970-01-01
          • 2011-02-21
          • 2012-10-16
          • 1970-01-01
          相关资源
          最近更新 更多