Пакетный скрипт Windows для рекурсивного извлечения определенных файлов с помощью 7zip

#windows #batch-file #extract #directory-structure #7zip

#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" amp;amp; del "%%~fI"
)
  

кроме 2 вещей:

  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, я нашел хорошие ссылки в обоих сообществах. Я использую SO чаще, поэтому я здесь.

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

Ответ №1:

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

В любом случае, для первой проблемы я обнаружил, что мне нужно будет выполнить рекурсию с помощью switch -x , т. Е., -xr И поскольку у меня было несколько расширений, которые я хотел пропустить, мне пришлось создать ignore.txt и добавить туда все исключения. Мой полный сценарий выглядел так:

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

Если бы у меня было только одно расширение, которое я хотел игнорировать, я бы сделал -xr!"*.extension" вместо -xr@"C:UsersfrozenfyrDesktopignore.txt"

Кстати, -xr не останавливает 7zip от обработки исключенных файлов, вероятно, он удаляет их после извлечения, потому что я видел extracting abc.TIF в командной строке.

Ответ №2:

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

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

Комментарии:

1. Не пробовал этого, но выглядит довольно чисто, если он действительно работает для того, что я хотел!

2. Ну, почему бы вам не попробовать 🙂

3. 1. Занят каким-то другим проектом, 2. Не получил тестовый файл с готовностью. Если у меня будет возможность успешно протестировать это, я обновлю свое решение, чтобы соответствующим образом связать его с вашим. Простите за то, что так неохотно звучит МИР 🙂

Ответ №3:

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