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

3
我正在开发一个构建系统。该构建系统将结果以zip文件的形式发布到目录中。不幸的是,我没有简单的方法来知道zip文件的名称,因为它是时间戳。在下一步操作中,我必须将此zip文件解压缩到特定位置,然后执行更多的文件操作。
我想我可以更改构建系统,以便从命令行指定结果zip文件的名称,但是,我认为找出哪个是最新的文件并解压缩它(如果前一个过程成功)可能是最简单的方法。
如何发出只对目录中最新的zip文件生效的解压缩命令,忽略所有其他文件?
编辑:我决定使用ANT的功能来完成此任务。然而,这仍然是一个很好的技巧...谢谢答案!
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。你需要同时使用&&(和)和||(或),以防万一解压缩由于某些原因而失败。

你需要将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)"

愿意这样做


你也可以下载http://unxutils.sourceforge.net/并将其添加到你的路径中,这样你就可以在命令提示符下使用许多标准Unix实用程序了——这是我在Windows机器上必备的工具,以防我忘记dir vs. ls、cat vs. type等。同时拥有grep、awk等工具也很不错。 - Randy
抱歉,更正一下上一个链接--看起来他们已经移动了一些东西,为了获取实际的文件,您必须前往http://sourceforge.net/projects/unxutils。 - Randy

-1

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


-2
为什么要使用批处理文件,而不是使用PowerShell或控制台应用程序呢?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接