使用7z.exe进行递归解压缩

6
我偶然发现了以下方法,可以提取每个子文件夹中的所有.zip文件。
FOR /F "usebackq" %a in (`DIR /s /b *.zip`) do 7z.exe e %a

我在WinXP的cmd.exe提示符上尝试过这个,但出现了错误:
"a was unexpected at this time."

请问上述代码有什么问题?这是7z.exe错误还是批处理脚本语法有问题?我将其复制粘贴到了.bat文件中。

谢谢。


1
你尝试使用 %%a 了吗? - Marco
这就是答案了。现在你最好点击“回答问题”,这样我就可以接受你的答案并给你一些积分。 :-) 感谢你的帮助。 - SparkyNZ
3个回答

13

在@PA的回答基础上(记得在验证输出正确后删除@echo),如果您想保留zip文件中的目录结构,请使用x命令而不是e

FOR /R %a IN (*.zip) DO @echo 7z x "%a"

如果您想将文件提取到与它们所在的zip文件同名的文件夹中,可以使用-o开关和%~n文件名提取前缀:

FOR /R %a IN (*.zip) DO @echo 7z x "%a" -o"%~na"

最后,如果你想执行上述所有操作并覆盖任何现有文件,请使用-aoa开关:

FOR /R %a IN (*.zip) DO @echo 7z x "%a" -o"%~na" -aoa

有用的资源

批处理文件

这是一个简洁明了的批处理脚本,适用于当前文件夹中的所有zip文件(假设已安装7zip)。它默认为echo命令将运行,只有在您传入/y时(即,请现在解压缩)才会运行。

:: To actually include the path expansion character (tilde), I had to give valid numbers; see http://ss64.com/nt/rem.html for bug reference. Also, try call /? for more info.
@REM The %~n0 extracts the name sans extension to use as output folder. If you need full paths, use "%~dpn0". The -y forces overwriting by saying yes to everything. Or use -aoa to overwrite.
@REM Using `x` instead of `e` maintains dir structure (usually what we want)

@FOR /R %%a IN (*.zip) DO @(
    @if [%1] EQU [/y] (
        @7z x "%%a" -o"%%~dpna" -aoa
    ) else (
        @echo 7z x "%%a" -o"%%~dpna" -aoa
    )
)

@echo USAGE: Use /y to actually do the extraction

12

尝试用%%a替换%a

FOR /F "usebackq" %%a in (`DIR /s /b *.zip`) do 7z.exe e %%a

有人能解释一下 usebackq 是什么意思以及它的来源吗? - Pete
1
@Pat:它用于告诉解析引擎使用反引号来识别要处理的命令或文件名。看一下 DIR /s /b *.zip - Marco

9

请阅读HELP FOR,然后在命令提示符中尝试以下操作...

FOR /R %a IN (*.zip) DO @ECHO 7z e "%a"

请注意,我们已经将%a放在双引号中。

一旦您确认输出的有效性,就可以删除ECHO。我建议将命令移动到BAT文件中。在这种情况下,请将%a更改为%%a。

@echo off
FOR /R %%a IN (*.zip) DO (
  7z e "%%a"
)

第二个建议PA也很酷,谢谢 - 我需要你使用的双引号。 - SparkyNZ

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