Извлеките все Zip-файлы в каталог (включая подпапки) с помощью файла .bat или команды dos

6

Я хочу извлечь все .zip и .rars в папку и ее детей

Структура выглядит так:

MAIN_FOLDER
    -A folder
        - a.zip
            -a.rar
    -B folder
        - b.zip
            -b.rar
    -C folder
        ....    
            ...

Я пробовал уже это, который не работал

FOR /D /r %%F in ("*") DO (

  pushd %CD%
 cd %%F
    FOR %%X in (*.rar *.zip) DO (
        "C:\Program Files\7-zip\7z.exe" x %%X
    )
 popd

)

Я использую Windows и у меня установлен 7-Zip.

Дополнительный вопрос: можно ли сохранить все извлеченные файлы из последних дочерних элементов (a.rar, b.rar) в одной и той же папке (основной папке)?

Эл. адрес
источник

Ответы:

12

Сценарий:

for /F %%I IN ('dir /b /s *.zip *.rar') DO (
    "C:\Program Files\7-Zip\7z.exe" x -o"%%~dpI" "%%I"
)

Объяснение:

for /F %%I IN ('dir /b /s *.zip *.rar') DO (

Это выполняет цикл для каждого файла, возвращаемого командой dir /b /s *.zip *.rar. /sГоворит dirв рекурсию подкаталогов и /bгравюры в голом формате.

Имя файла сохраняется в %%Iпеременной для последующего использования. Если вы набрали это в приглашении, вы бы использовали %Iвместо этого.

"C:\Program Files\7-Zip\7z.exe" x -o"%%~dpI" "%%I"

Это выполняет извлечение. Аргумент -o"%%~dpI"извлекает файл в тот же каталог, где находится архив. Другие опции:

  • -o"%%~dpI" - Извлекает в каталог, где находится архив.

  • -o"%%~dpnI"- Создает новый каталог в иерархии, названной в честь архива, и извлекает его (то есть AFolder\archive.zipизвлекает в AFolder\archive\).

  • -o"%%~nI"- Создает новый каталог в текущем каталоге с именем архива и извлекает его (то есть AFolder\archive.zipизвлекает в .\archive\).

  • Опустить -oаргумент - Извлекает в текущий каталог.

Пример:

C:\Temp>tree /F

    Folder PATH listing
    Volume serial number is 08A4-22E0
    C:.
    │   batch.bat
    │
    ├───AFolder
    │       a.zip
    │
    ├───BFolder
    │       b.zip
    │
    └───CFolder
            c.zip



C:\Temp>batch.bat > nul


C:\Temp>tree /F

    Folder PATH listing
    Volume serial number is 08A4-22E0
    C:.
    │   batch.bat
    │
    ├───AFolder
    │       a.zip
    │       a.zip.txt
    │
    ├───BFolder
    │       b.zip
    │       b.zip.txt
    │
    └───CFolder
            c.zip
            c.zip.txt
Стивен Дженнингс
источник
Отличный ответ! Один из лучших, которые я когда-либо видел. Тщательно, но ясно и кратко, объяснил. Хорошая работа!
ksoo
Будет ли сложно расширить скрипт, чтобы я мог добавить жестко закодированный путь для всех папок, которые будут извлечены? Таким образом, вместо извлечения в текущем местоположении, извлекать в новую папку путь?
Остин
@ Остин У меня нет доступа к нему сейчас, но 7-Zip поставляется с отличным файлом справки. Там есть раздел для всего, что 7-Zip может сделать из командной строки, и я готов поспорить, что вы хотите, там.
Стивен Дженнингс
2
Обратите внимание, что это не будет работать, если в каталогах или именах файлов есть пробел или вкладка. Чтобы работать с ними, вам нужно указать параметр "delims =", чтобы удалить их как разделители токенов.
Мысль
1

Я считаю , что вы ищете в forfilesкоманде :

  • forfiles /s /m *.zip /c "7z x @file"

  • forfiles /s /m *.rar /c "7z x @file"

Майлз Эриксон
источник
спасибо за ваш совет. это не работает как задумано. извините, я не настолько тверд в командах дос. кто-то возражает против написания рабочего кода? спасибо и в любом случае счастливого Рождества :)
электронная почта
1
Вы рассматривали возможность использования PowerShell вместо этого? Должен быть длинный однострочный.
Джим Б.
2
@ Электронная почта (1) Какую ошибку вы получаете? Сказать «это не работает» без подробностей не конструктивно, и «кто-то возражает против написания рабочего кода?» оскорбительно (2) Является ли программный каталог 7z.exe в% PATH%?
Майлз Эриксон
1

Я просто использую sweep.exe лет назад. Он запускает ту же команду в текущем каталоге и во всех подкаталогах.

Вам может понадобиться запустить Sweep более одного раза, если вы хотите извлечь архивы из архива.

Вы можете использовать что-то вроде:

sweep 7za x -y *.zip

чтобы открыть все .zip файлы в текущей папке и все папки внизу.

Версия командной строки 7zip находится здесь: http://www.7-zip.org/download.html

солнце
источник
1

Это обновление принятого ответа для поддержки имен файлов с пробелами ("DELIMS =") и пропуском перезаписи (-aos). Смотрите ссылки ниже и обновленный код. Спасибо

Извлеките все Zip в каталог (включая подпапки) с помощью файла .bat или команды dos https://stackoverflow.com/questions/12487491/how-to-handle-space-of-filename-in-batch-for-loop http://7zip.bugaco.com/7zip/MANUAL/switches/overwrite.htm

for /F "DELIMS=" %%I IN ('dir /b /s *.zip *.rar') DO (
    "H:\Program Files\7-Zip\7z.exe" x -aos -o"%%~dpI" "%%I"
)
YGJ
источник
для / F "DELIMS =" %% I IN ('dir / b / s * .zip * .rar') DO ("C: \ Program Files \ 7-Zip \ 7z.exe" x -aos -o "% % ~ dpI "" %% I ")
запускается
0
7z e -an -air!*.rar -r

извлекает все RAR-файлы из подпапок текущего каталога (рекурсивно) в текущую папку. Измените на -air! *. Zip для zip-файлов.

Халат
источник
0
@echo off

FOR /R %%g IN (.) DO TITLE Extracting from %%~ng & "%~dp07z.exe" x -aou "%%g\*.rar" -o"%%g" & "%~dp07z.exe" & CLS

Скопируйте его в текстовый файл, переименуйте в extract.batи поместите в родительскую папку, содержащую другие папки с архивами. Поместите его 7z.exeв ту же папку, что и extract.batфайл, или измените путь в приведенной выше команде, чтобы отразить установленное местоположение вашего 7z.exe. Это извлекает все RAR в каждой подпапке в ту же подпапку, что и RAR. Это не делает никакой "уборки дома" (как моя подруга) ...

Отрегулируйте в *.rarсоответствии с вашими потребностями.

Kevin
источник