Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Распаковка по маске (http://forum.oszone.net/showthread.php?t=317417)

pawok_21 02-08-2016 12:01 2656120

Распаковка по маске
 
Добрый день.
Возникла потребность в 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 2657681

Код:

@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 2657765

alpap, Спасибо, все четоко отработало!

pawok_21 18-07-2017 13:39 2752280

Цитата:

Цитата alpap
@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 2752417

Код:

@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 2752433

Цитата:

Цитата megaloman
Скрытый текст
@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 2752711

pawok_21, обратите внимание, я исправил неточность в коде, а Вы этого не увидели, вместо
Md "%BoxOut%\%%s%Flag%" &&Mov ......
Надо
Код:

Md "%BoxOut%\%%s%Flag%" 2>nul &Move "%%s%Flag%*.%ExtOut%" "%BoxOut%\%%s%Flag%\"
Это существенно при повторном запуске скрипта, когда выходные папки уже существуют.


Время: 12:13.

Время: 12:13.
© OSzone.net 2001-