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

时间:2014-06-21 07:29:39

标签: windows batch-file extract directory-structure 7zip

我的目录中包含多个.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
                ...
            .
            .
            .
        .
        .

我需要一个批处理脚本来递归地从每个.XML中提取.zip,同时保持树结构(首先,所有.zip将从主.tar中提取,然后每个.XML只有.zip。此外,之后应删除已处理的档案。

我可以使用此代码实现大部分内容

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文件上的脚本,它可以工作(它们会被删除 处理)。

  3. 我已经尝试了powershell script,但我对此并不十分满意。我觉得批处理脚本很容易让我处理。我甚至找到了post on SU,但它没有提到多种特定的格式/文件。我看了Command Line Version User's Guide并考虑了-x switch,但这没用。

    我不能在这里引用所有引用,但我确实经历了很多SO和SU帖子,Google这次可能不是我的朋友。我不确定SO或SU是否应该成为提出这个问题的地方,我在两个社区都找到了很好的参考。我经常使用SO,所以我在这里。

    请帮帮我,这让我发疯了..

3 个答案:

答案 0 :(得分:2)

我能够解决我的第一个问题。第二个看起来有点复杂。 del命令适用于较小的归档。因为我的.tar很大(> 1GB),我认为下一个循环在命令可以删除存档之前开始执行。如果不是其他任何人在这里作为未来的指南得到答案,那将对我有好处。

无论如何,对于第一个问题,我发现我需要使用switch -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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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