Войти

Показать полную графическую версию : [решено] Распаковка по маске


pawok_21
02-08-2016, 12:01
Добрый день.
Возникла потребность в bat файле с функцией разархивирования группы RAR архивов по маске наименования файлов с созданием соответствующих каталогов.
Пример:
-папка с архивами- -извлекаемые файлы-
С:\Folder\archiv1.rar --->abc_123456.txt
С:\Folder\archiv1.rar --->qwer_987654.txt
***
С:\Folder\archiv2.rar --->abc_654321.txt
С:\Folder\archiv2.rar --->qwer_456789.txt

Необходимый результат разархивации по флагу "_"
С:\Folder-rez\abc_\abc_123456.txt
С:\Folder-rez\abc_\abc_654321.txt
***
С:\Folder-rez\qwer_\qwer_987654.txt
С:\Folder-rez\qwer_\qwer_456789.txt

Заранее выражаю свою благодарность за любую помощь в решении проблемы.

alpap
07-08-2016, 20:13
@echo off
set "d_in=C:\Folder"
set "d_out=C:\Folder-rez"
for /f "delims=" %%A in ('dir/a-d/b "%d_in%\*.*"') do (
for /f "tokens=2* delims=_ " %%a in ('""%ProgramFiles%\7-Zip\7z.exe" x "%%A" -o"%%~nA"|find "Extracting""') do (
if not exist "%d_out%\%%a" md "%d_out%\%%a"
for %%B in ("%d_out%\%%a") do set n=0& call :l "%%~nA" "%%~nB" "%%a" "%%b"
)
rd /s /q "%%~nA"
)
exit

:l
if "%~2"=="%~3" if not exist "%d_out%\%~3\%~3%n%_%~4" (copy "%~1\%~3_%~4" "%d_out%\%~3\%~3%n%_%~4") else (set/a n+=1& goto l)
exit/b
.

pawok_21
08-08-2016, 09:58
alpap, Спасибо, все четоко отработало!

pawok_21
18-07-2017, 13:39
@echo off
set "d_in=C:\Folder"
set "d_out=C:\Folder-rez"
for /f "delims=" %%A in ('dir/a-d/b "%d_in%\*.*"') do (
for /f "tokens=2* delims=_ " %%a in ('""%ProgramFiles%\7-Zip\7z.exe" x "%%A" -o"%%~nA"|find "Extracting""') do (
if not exist "%d_out%\%%a" md "%d_out%\%%a"
for %%B in ("%d_out%\%%a") do set n=0& call :l "%%~nA" "%%~nB" "%%a" "%%b"
)
rd /s /q "%%~nA"
)
exit
:l
if "%~2"=="%~3" if not exist "%d_out%\%~3\%~3%n%_%~4" (copy "%~1\%~3_%~4" "%d_out%\%~3\%~3%n%_%~4") else (set/a n+=1& goto l)
exit/b »

Задача немного усложнилась. Нужно добавить проверку на расширение извлекаемых фалов. К примеру в архивы помещены файлы *.jpg а нужно извлечь только файлы формата *.txt . Как добавить такую проверку в код?

megaloman
19-07-2017, 08:20
@Echo Off

Set "BoxIn=Z:\Folder"
Set "BoxOut=Z:\Folder-Rez"

Set "Flag=_"
Set "ExtOut=txt"

Set "ExtIn=rar"
Set "Arc="C:\Program Files\WinRAR\WinRAR.exe" e -y"

Set "BoxTmp=%BoxOut%\%~nx0.tmp"
Rd "%BoxTmp%" /S /Q 2>nul
Md "%BoxTmp%"

Pushd "%BoxTmp%" &&(
%Arc% "%BoxIn%\*.%ExtIn%" "*%Flag%*.%ExtOut%"
For %%f In ("*.%ExtOut%") Do If Exist "%%f" (
FOR /F "usebackq delims=%Flag%" %%s IN ('%%f') DO (
Md "%BoxOut%\%%s%Flag%" 2>nul &Move "%%s%Flag%*.%ExtOut%" "%BoxOut%\%%s%Flag%\"
)
)
)
Popd
Rd "%BoxTmp%" /S /Q 2>nul

pawok_21
19-07-2017, 09:32
@Echo Off
Set "BoxIn=Z:\Folder"
Set "BoxOut=Z:\Folder-Rez"
Set "Flag=_"
Set "ExtOut=txt"
Set "ExtIn=rar"
Set "Arc="C:\Program Files\WinRAR\WinRAR.exe" e -y"
Set "BoxTmp=%BoxOut%\%~nx0.tmp"
Rd "%BoxTmp%" /S /Q 2>nul
Md "%BoxTmp%"
Pushd "%BoxTmp%" &&(
%Arc% "%BoxIn%\*.%ExtIn%" "*%Flag%*.%ExtOut%"
For %%f In ("*.%ExtOut%") Do If Exist "%%f" (
FOR /F "usebackq delims=%Flag%" %%s IN ('%%f') DO (
Md "%BoxOut%\%%s%Flag%" &&Move "%%s%Flag%*.%ExtOut%" "%BoxOut%\%%s%Flag%\"
)
)
)
Popd
Rd "%BoxTmp%" /S /Q 2>nul »
Спасибо огромное, все работает.
Я так понял в процессе работы создается папка темп, по завершению работы все разархивированные фалы перемещаются в нужную папку. Надеюсь не зависнет при копировании, так как итоговых файлов на 10-ки Гигабайт и порядка 2-3 млн. файлов.

megaloman
20-07-2017, 10:58
pawok_21, обратите внимание, я исправил неточность в коде, а Вы этого не увидели, вместо
Md "%BoxOut%\%%s%Flag%" &&Mov ......
НадоMd "%BoxOut%\%%s%Flag%" 2>nul &Move "%%s%Flag%*.%ExtOut%" "%BoxOut%\%%s%Flag%\"Это существенно при повторном запуске скрипта, когда выходные папки уже существуют.




© OSzone.net 2001-2012