使用7zip递归提取特定文件的Windows批处理脚本

5

我有一个目录,其中包含多个.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,同时保持目录结构(首先从主 .tar 中提取所有 .zip,然后只提取每个 .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"
)

除了两件事:

  1. 我无法仅提取.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的操作?

  2. 主要的.tar文件在处理后未被删除。我尝试在.zip文件上运行此脚本,它有效(处理后被删除)。

我已经尝试过powershell脚本,但我对它不是很满意。我感觉批处理脚本更容易处理。我甚至在SU的帖子中找到了一些资料,但它没有涉及多个特定格式/文件。我阅读了命令行版本用户指南并考虑了-x开关,但它没有用处。
我不能在这里引用所有的参考文献,但我确实查看了很多SO和SU的帖子,Google可能这次不是我的朋友。我不确定SO或SU应该是提问这个问题的地方,我在两个社区都找到了好的参考资料。我经常使用SO所以我来这里。
请帮帮我,这让我发疯了...
3个回答

3
7z e -an -air!*.rar -r -oF:\target

从当前目录的子文件夹(递归)中提取所有tar文件到目标文件夹F:\target。


还没有尝试过,但如果它确实能够满足我的需求,那看起来非常不错! - Fr0zenFyr
那么,为什么不试试呢 :) - rob2universe
  1. 忙于其他项目。
  2. 没有准备好测试文件。如果我有机会成功测试,我会更新我的解决方案并适当地链接到你的。抱歉听起来这么不情愿,祝一切顺利 :)
- Fr0zenFyr

2
我已经解决了我的第一个问题。第二个问题看起来有点复杂。命令del只适用于较小的存档。因为我的.tar文件很大(>1GB),我认为在命令删除存档之前,下一个循环就开始执行了。如果有人能给我一个答案作为未来的指南,那对我来说是很好的。
无论如何,对于第一个问题,我发现我需要使用带有开关-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\Desktop\ignore.txt"
顺便说一下,-xr并不会阻止7zip处理被排除的文件,它可能会在提取后将其删除,因为我在命令提示符上看到了extracting abc.TIF

0
为了递归地读取zip文件,我正在使用“Swiss File Knife”。如果您有可能在系统上安装其他软件,这可能是一个好主意?

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