Как извлечь все многотомные архивы RAR из подпапок папки?

Ищу способ распаковать многотомные архивы после скачивания через пакет.

Я скачиваю папки с .r?? файлы в нем через программу мониторинга FTP и хотите, чтобы WinRAR зашел в первую подпапку в исходной папке и начал распаковывать .r00, удалите архив и переместите папку с распакованными файлами в новое место.

Затем пакетный скрипт должен снова запустить этот процесс со следующей подпапкой.

Допустим, исходная папка C:\Users\unpack содержит следующие подпапки с файлами:

  • source folder
    • subfolder1
      • Archive1.r00
      • Архив1.r01
      • Архив1.r02
      • ххх.txt
    • subfolder2
      • Archive2.r00
      • Архив2.r01
      • гггг.txt
    • subfolder3
      • Archive3.r00
      • Архив 3.r01
      • Архив 3.r02
      • Архив 3.r04
      • Архив 3.r05
      • zzz.txt

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

Как распаковать все архивы rar во все подпапки папки и потом удалить архивы?

Сценарий по ссылке выше распаковывает все файлы во всех подпапках, а затем перемещает папку с ее файлами в новое место. Я хочу, чтобы скрипт распаковывал и перемещал подпапку за подпапкой в ​​исходной папке.

Изменить.1

Если winrar готов с первой подпапкой, структура исходной папки должна выглядеть так:

  • source folder
    • subfolder2
      • Archive2.r00
      • Архив2.r01
      • гггг.txt
    • subfolder3
      • Archive3.r00
      • Архив 3.r01
      • Архив 3.r02
      • Архив 3.r04
      • Архив 3.r05
      • zzz.txt

Файлы и папки в C:\Users\new-location должны выглядеть так:

  • source folder
    • subfolder1
      • xxx.mp4
      • ххх.txt
    • subfolder2
      • yyy.mp4
      • гггг.txt
    • subfolder3
      • zzz.mp4
      • zzz.txt

person BASF    schedule 16.07.2015    source источник
comment
Чем именно то, что вы хотите, отличается от того, что делает сценарий?   -  person SomethingDark    schedule 17.07.2015


Ответы (1)


Возможный пакетный код для этой задачи:

@echo off
setlocal EnableDelayedExpansion
set "BaseSourceFolder=C:\Users\Unpack"
set "BaseTargetFolder=C:\Users\New-Location"
for /D %%D in ("%BaseSourceFolder%\*") do (
    set "TargetFolder=%BaseTargetFolder%\%%~nxD"
    if not exist "!TargetFolder!" md "!TargetFolder!"
    "%ProgramFiles%\WinRAR\Rar.exe" x -cfg- -idq -y "%%~fD\*.r??" "!TargetFolder!"
    if not errorlevel 1 (
        del /F /Q "%%~fD\*.r??"
        move /Y "%%~fD\*" "!TargetFolder!">nul 2>nul
        rd "%%~fD" 2>nul
    )
)
rem rd "%BaseSourceFolder%" 2>nul
endlocal

for /?, выполненный в окне командной строки, отображает справку по команде for с параметром /D, что означает для каждого каталога, совпадающего с * в базовой исходной папке.

В цикле сначала имя целевой папки определяется на основе имени обрабатываемой подпапки. %%~fD и %%~nxD также объясняются for /?, при этом папки обычно не имеют расширения, и поэтому %%~nD часто бывает достаточно.

Затем создается эта целевая папка, если она еще не существует.

Затем выполняется Rar.exe для извлечения многотомного архива из текущей подпапки непосредственно в заданную целевую папку.

*.r?? используется для того, чтобы этот пакетный файл работал с многотомными архивами со старой схемой именования ArchiveName.r00, ArchiveName.r01, ..., а также с улучшенной схемой именования ArchiveName.part01.rar, ArchiveName.part02.rar, ..., которая по умолчанию используется в WinRAR версия 5.21. RAR автоматически пропускает архивные файлы, уже обработанные во время извлечения многотомного архива, из списка, соответствующего *.r??.

Код выхода Rar.exe оценивается, чтобы определить, произошла ли какая-либо ошибка. Если код выхода, присвоенный уровню ошибки, ниже 1, ошибки не было и выполняются 3 команды ветки if, что приводит к удалению сначала всех архивных файлов RAR.

Остальные файлы в текущей подпапке также перемещаются в текущую целевую папку, которая является файлом *.txt в примере структуры папок.

Поскольку текущая вложенная папка теперь должна быть пустой, команда rd должна иметь возможность удалить каталог. В случае ошибки из-за того, что вложенная папка все еще не пуста, вложенная папка остается в базовой исходной папке.

Базовая исходная папка пуста, если все работало без ошибок. Закомментированную строку после цикла for можно использовать и для удаления пустой базовой исходной папки, но сохранить папку, если что-то пошло не так.

person Mofi    schedule 17.07.2015