3

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

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

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

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

4

4 回答 4

11

这应该这样做:

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仅针对第一个文件运行。如果由于某种原因解压缩失败,您需要同时使用&&(and) 和||(or)。

您需要更改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”选项。

于 2008-10-07T15:23:47.837 回答
2

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

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

会做的

于 2008-10-07T15:27:22.230 回答
-1

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

于 2008-10-07T15:14:11.677 回答
-2

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

于 2008-10-07T15:12:18.017 回答