我有数百个子目录,每个子目录中都有一个或多个档案。我想递归提取每个子目录中的每个档案,并将提取的文件输出到每个子目录中。
从这个开始:
DIR1
SUBDIR2
--->ZipFileA
--->ZipFileB
SUBDIR3
--->ZipFileC
--->ZipFileD
希望以此结束:
DIR1
SUBDIR2
--->ExtractedZipFileA
--->ExtractedZipFileB
SUBDIR3
--->ExtractedZipFileC
--->ExtractedZipFileD
我该怎么做呢?
我试过了...
7z x E:\Downloads\New -r -o*
...但是这会将所有内容输出到主目录中,而不是将它们输出到它们自己的子目录中。
答案1
像魔法一样工作:
for /r %a in (*.zip) do 7z.exe e "%~a" -o"%~dpa"
答案2
我发现上面列出的是:
for /r %a in (*.zip) do 7z.exe e "%~a" -o"%~dpa"
将所有内容展开到当前目录中。无论如何,这不是我所寻找的。
因此,假设我处于一个包含多个 .zip 文件的工作目录中,并且每个 zip 文件都包含其他 zip 文件等,那么以下操作将展开它们并保留路径:
for /r %A in ("*.zip") do 7z.exe x "%~dfA" -o"%~pnA"
为了解释这一点,有两个部分,
- 根据条件搜索文件
- 对找到的每个文件执行某些操作
第一部分,搜索/r %A ("*.zip")
搜索匹配的文件(“*.zip”)并为了找到的每个文件用文件名替换变量 %A,然后将其传递给第二部分...我跳过了 /r,即递归标志
第二部分,做一些事情(所以对于找到的每个文件都执行...)
do 7z.exe x "%~dfA" -o"%~pnA"
执行 7z.exe x- 执行 7zip 提取
,然后为 7z 提供两个参数
“%〜dfA”:“%-DF”在这种情况下,bit 获取驱动器号和其后的任何内容的完全限定路径A紧随其后,这是对我们之前声明的引用A并且文件被传递给 do
-o"%~pnA":-o是 7zip 输出标志
"%~pn提取路径和文件名(不含扩展名),同样A
例子
给定文件:压缩包:\测试\foo.zip被传递给:-o"%~pnA"
“%-p”将从文件中提取路径,*c:\测试*
“n“将提取简单的文件名,富
导致目录:\测试\foo
参考 https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/for