如何在BAT文件的目录中解压缩最新文件?

时间:2008-10-07 15:11:14

标签: build-process batch-file unzip

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

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

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

编辑:我决定使用ANT中的功能代替此任务。然而,让这个小伙子玩起来仍然是一个巧妙的伎俩......谢谢你的回答!

4 个答案:

答案 0 :(得分:10)

这应该这样做:

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”选项。

答案 1 :(得分:2)

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

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

会这样做

答案 2 :(得分:-1)

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

答案 3 :(得分:-2)

为什么在使用PowerShell或控制台应用程序时使用bat文件?