#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 вещей:
-
Я не могу извлечь
.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
-
Основной
.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-файла я использую «Швейцарский файловый нож». Если у вас есть возможность установить другое программное обеспечение в вашей системе, это может быть идеей?