我有一个包含多个 .tar
文件的目录,其中包含多个 .zip
文件。树结构有点像这样:
testDirectory
-tarArchive.tar
-directory1
-zipArchive11.zip
abc.XML
1.TIF
2.TIF
...
-zipArchive12.zip
xyz.XML
a.TIF
b.CDX
...
.
.
.
-directory2
-zipArchive21.zip
...
-zipArchive22.zip
...
.
.
.
.
.
我需要一个批处理脚本来递归地从每个 .zip
中仅提取 .XML
,同时保持树结构(首先是所有 .zip
将从主 .tar
中提取,然后仅从每个 .zip
中提取 .XML
)。此外,处理后的文件应在之后删除。
我可以用这段代码实现其中的大部分
for /R "C:\Users\frozenfyr\Desktop\test" %%I in ("*.zip", "*.tar") do (
"C:\Program Files\7-Zip\7z.exe" x -y -o"%%~dpI" "%%~fI" && del "%%~fI"
)
除了两件事:
我无法仅提取
.XML
文件。"C:\Program Files\7-Zip\7z.exe"x -y -o"%%~dpI""%%~fI"
"* .zip"-r
将 不提取 XML 文件和"C:\Program Files\7-Zip\7z.exe"x -y -o"%%~dpI""%%~fI"
"*.XML"-r
不(不应该)工作,因为.tar
文件中没有匹配项。 有没有办法做类似的事情"C:\Program Files\7-Zip\7z.exe"x -y -o"%%~dpI""%%~fI"
"*.zip""*.XML"-r
主
.tar
文件在处理后没有被删除。我试过这个.zip
文件上的脚本并且它有效(它们在之后被删除 处理)。
我已经试过 powershell script但我不是很满意。我觉得批处理脚本对我来说很容易处理。我什至找到了 post on SU但它没有提到多种特定格式/文件。我读了Command Line Version User's Guide并考虑了-x
switch但它没有用。
我不能在这里引用所有引用资料,但我确实浏览了很多 SO 和 SU 帖子,这次 Google 可能不是我的 friend 。我不确定 SO 还是 SU 应该是问这个问题的地方,我在这两个社区都找到了很好的引用资料。我更经常使用 SO,所以我来了。
请帮助我,这让我发疯..
最佳答案
我已经能够解决我的第一个问题。第二个看起来有点复杂。 del
命令适用于较小的文件。因为我的 .tar
很大 (>1GB),我认为下一个循环会在命令删除存档之前开始执行。如果没有其他人在这里得到答案作为 future 的指南,这对我来说是件好事。
无论如何,对于第一个问题,我发现我需要使用开关 -x
进行递归,即 -xr
并且因为我有多个扩展,所以我想跳过,我必须创建 ignore.txt
并在其中添加所有异常。我的完整脚本如下所示:
for /R "C:\Users\frozenfyr\Desktop\test" %%I in ("*.zip", "*.tar") do (
"C:\Program Files\7-Zip\7z.exe" x -y -xr@"C:\Users\frozenfyr\Desktop\ignore.txt" -o"%%~dpI" "%%~fI" && del "%%~fI"
)
如果我只想忽略一个扩展名,我会使用 -xr!"*.extension"
而不是 -xr@"C:\Users\frozenfyr\桌面\ignore.txt"
顺便说一句,-xr
不会阻止 7zip 处理排除的文件,它可能会在解压后删除它们,因为我在命令提示符下看到了 extracting abc.TIF
。
关于使用 7zip 递归提取特定文件的 Windows 批处理脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24339419/