Пакетный скрипт Windows для рекурсивного извлечения определенных файлов с помощью 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 будут извлечены из main .tar, а затем только .XML из каждого .zip). Кроме того, обработанные архивы должны быть удалены впоследствии.

Я могу достичь большей части этого с помощью этого код

for /R "C:UsersfrozenfyrDesktoptest" %%I in ("*.zip", "*.tar") do (
  "C:Program Files7-Zip7z.exe" x -y -o"%%~dpI" "%%~fI" && del "%%~fI"
)

Кроме двух вещей:

  1. Я не могу извлечь только файлы .XML.

    "C:Program Files7-Zip7z.exe" x -y -o"%%~dpI" "%%~fI""*.zip" -r Уилл не извлекать файлы XML и "C:Program Files7-Zip7z.exe" x -y -o"%%~dpI" "%%~fI""*.XML" -r не работает (не должно работать), потому что ничего не будет совпадать в файле .tar. Есть ли способ сделать что-то вроде "C:Program Files7-Zip7z.exe" x -y -o"%%~dpI" "%%~fI""*.zip" "*.XML" -r

  2. Основной файл .tar не удаляется после обработки. Я попробовал это скрипт на .zip файлы и он работает(они удаляются после обработка).

Я уже пробовал скрипт powershell, но он меня не очень устраивает. Я чувствую, что пакетный сценарий легко для меня обрабатывать. Я даже нашел сообщение на SU, но оно не говорит о нескольких конкретных форматах/файлах. Я прочитал руководство пользователя версии командной строки и рассмотрел -x переключатель , но это бесполезно.

Я не могу процитировать все ссылки здесь, но я действительно прошел через много сообщений SO и SU, и Google был возможно, на этот раз не мой друг. Я не уверен, что SO или SU должны быть местом, чтобы задать этот вопрос, я нашел хорошие ссылки на оба сообщества. Я использую так чаще, поэтому я здесь.

Пожалуйста, помогите мне, это сводит меня с ума..
3 4

3 ответа:

Я был в состоянии решить мой 1-ый проблема. Второй выглядит немного сложным. Команда del работает с архивами меньшего размера. Поскольку мой .tar огромен (>1 ГБ), я думаю, что следующий цикл начнет выполняться до того, как команда сможет удалить архив. Было бы хорошо для меня, если не для кого-то другого, иметь ответ здесь в качестве руководства для будущего.

В любом случае, для первой задачи я обнаружил, что мне нужно будет сделать рекурсивную операцию с переключателем -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 в командной строке.

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

Извлекает все файлы tar из вложенных папок текущего каталога (рекурсивно) в целевую папку. F:\target.

Для того, чтобы читать zip-файл рекурсивно, я использую "файл швейцарский нож". Если у вас есть возможность установить другое программное обеспечение в вашей системе, это может быть идея?