如何在 Windows 批处理文件中使用 7zip 从 ZIP 存档中提取最后一个目录?

Posted

技术标签:

【中文标题】如何在 Windows 批处理文件中使用 7zip 从 ZIP 存档中提取最后一个目录?【英文标题】:How do I extract just the last directory from a ZIP archive using 7zip in a Windows batch file? 【发布时间】:2013-06-18 11:52:25 【问题描述】:

我有一个具有深层目录结构的 ZIP 存档。我只想解压最后一个目录(“Package”)。我想要它的所有子目录和内容。我不知道里面会有什么,但我想要它。

假设存档看起来像这样

package.zip
  folder1\
    folder2\
      folder3\
        Package\
          PackageTmp\

我开始在 Windows 批处理文件中使用 7zip CLI 编写此脚本。

@ECHO OFF
FOR /F "usebackq tokens=*" %%i in (DIR *.zip /B /A:-D) DO CALL :EXTRACT %%i
GOTO :EOF

:EXTRACT
IF "%1"=="" GOTO :EOF
SET zipfile=%1
SET folder=%zipfile:~0,-4%
7za.exe x %zipfile% -o%folder% -y PackageTmp*
GOTO :EOF

7zip 总是告诉我:没有要处理的文件。

【问题讨论】:

这个问题是可以挽救的,如果@ChristianGK 回来并添加一些细节,它不需要关闭!例如,您启动的脚本的输出是什么?你哪里出了问题? 说真的,这是该用户提出的唯一问题,给他一个机会!这个问题是合法的。 对于令人困惑和不完美的问题,我们深表歉意。现在应该很清楚了。 不用担心,您只需要一点帮助!现在你有了答案! 【参考方案1】:

您必须添加 -r unzip 选项并将反引号添加到 for 循环中,见下文。

FOR /F "usebackq tokens=*" %%i in (`DIR *.zip /B /A:-D`) DO CALL :EXTRACT %%i
GOTO :EOF

:EXTRACT
IF "%1"=="" GOTO :EOF
SET zipfile=%1
SET folder=%zipfile:~0,-4%
7za.exe x %zipfile% -o%folder% -y -r PackageTmp*
GOTO :EOF

反引号用于执行它们之间的命令。只有在 for 循环的选项中添加 usebackq 才能使用它们。

执行命令并循环遍历结果也可以通过以下(更老式和有限的)方式使用单引号来完成。

FOR /F "tokens=*" %%i in ('DIR *.zip /B /A:-D') DO CALL :EXTRACT %%i

查看 dos 命令for /? 了解更多信息。

【讨论】:

当我添加 -r 时,我还获得了 PackageTmp* 之前的文件夹结构 你是对的。如果没有父文件夹,我找不到提取 PackageTmp* 的方法。您必须自己向上移动它们(通过批处理脚本)并删除父文件夹。 反引号有什么作用?他们是转义字符还是什么?你能把语句用单引号或双引号括起来吗? (请在您的答案正文中添加任何澄清的 cmets!)

以上是关于如何在 Windows 批处理文件中使用 7zip 从 ZIP 存档中提取最后一个目录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不将批处理文件复制到 c 中的 7zip 文件夹的情况下运行 7zip 批处理

7Zip 更好的策略,通过命令行将一个文件压缩到一个 7z 文件中

使用 7zip 命令将目录中的文件归档到单个 zip [关闭]

Mac 像windows一样使用右键压缩,使用p7zip实现

7zip在目录中批量处理多个文件,而存档中没有文件夹

批处理 7zip,将文件压缩到没有任何文件夹的存档中