Войти

Показать полную графическую версию : Подскажите скрипт для пакетной распаковки, чт каталог создавался если файлов больше 1


alex_moscow
25-09-2021, 12:57
Всем привет. Буду очень признателен, если подскажете пример кода для BAT
который распаковывал бы все архивы rar zip в каталоге и подкаталогах c:\temp , но каталог с именем архива создавался только если внутри архива больше 1 файла.
средствами 7zip установленного по стандартному пути.

Основная задача не перегружать главный каталог ненужными каталогами, а только теми, где файлов 2 и больше.
А то лежит в каждом архиве еще файлик info и например скрин, и это все распаковывается в общую папку info, где эти файлы накапливаются с каждого архива.
Сам использовал этот код с вашего сайта, - может на его основе можно сделать необходимое ?
@ECHO ON

SET source=C:\temp
FOR /F "TOKENS=*" %%F IN ('DIR /S /B "%source%\*.zip"') DO "C:\Program Files\7-Zip\7z.exe" x "%%~fF" -o"%%~pF\"
FOR /F "TOKENS=*" %%F IN ('DIR /S /B "%source%\*.7z"') DO "C:\Program Files\7-Zip\7z.exe" x "%%~fF" -o"%%~pF\"
FOR /F "TOKENS=*" %%F IN ('DIR /S /B "%source%\*.rar"') DO "C:\Program Files\7-Zip\7z.exe" x "%%~fF" -o"%%~pF\"
pause 0
Заранее спасибо за ответы.

Iska
25-09-2021, 13:42
alex_moscow, примеры тех и других архивов приведите. А то непонятно, каким образом связаны файл info и каталог info.

alex_moscow
25-09-2021, 14:03
пример каталог внутри архивы и папки с архивами
temp\1\afile.zip (внутри архива 2 exe файла)
temp\2\bfile.zip (внутри архива 1 exe файл)
temp\cfile.zip (внутри архива 1 exe файл)

результат должен быть :
temp\1\afile\ (тут два файла)
temp\2\bfile.exe (без каталога, т.к. в архиве файл один)
temp\cfile.exe (без каталога, т.к. в архиве файл один)

Т.е. необходимо правило
файлов в архиве больше 1 - значит распаковываем их в свой каталог с именем архива
Если файл в архиве один - значит его распаковываем в корень пути. папку не создавать.
Ну и бонусом удалить все архивы после распаковки.

Iska
25-09-2021, 15:19
Пробуйте. Пока без удаления. Обратите внимание, что используется 7za.exe, а не 7z.exe.
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=c:\temp

pushd "%sSourceFolder%" && (
for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d /s "*.zip" "*.7z" "*.rar"`) do (
echo [%%~fi]
"%ProgramFiles%\7-Zip\7za.exe" t "%%~i" | >nul find.exe /i "Files:" ^
&& >nul "%ProgramFiles%\7-Zip\7za.exe" x "%%~i" -y -o%%~dpni ^
|| >nul "%ProgramFiles%\7-Zip\7za.exe" x "%%~i" -y -o%%~dpi
)
popd
) || (
echo Folder [%sSourceFolder%] not found.
exit /b 1
)

endlocal
exit /b 0

alex_moscow
25-09-2021, 15:44
спасибо большое !!! отлично, все работает. удаление архивов надо делать в цикле или просто одной строкой в конце ?

Iska
25-09-2021, 15:53
Пробуйте:
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFolder=c:\temp2

pushd "%sSourceFolder%" && (
for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d /s "*.zip" "*.7z" "*.rar"`) do (
echo [%%~fi]
"%ProgramFiles%\7-Zip\7za.exe" t "%%~i" | >nul find.exe /i "Files:" ^
&& ( >nul "%ProgramFiles%\7-Zip\7za.exe" x "%%~i" -y -o%%~dpni && del /f /q "%%~i" ) ^
|| ( >nul "%ProgramFiles%\7-Zip\7za.exe" x "%%~i" -y -o%%~dpi && del /f /q "%%~i" )
)
popd
) || (
echo Folder [%sSourceFolder%] not found.
exit /b 1
)

endlocal
exit /b 0

Удаляться архивы должны только при успешном извлечении файлов.

alex_moscow
25-09-2021, 16:02
да, по поводу удаления согласен. если делать сразу в одном файле, то можно все испортить.
Проверил - все работает по отдельности. Огромное вам спасибо. Хотел привести большую базу с ZX speccy софтом в приличный вид.

Iska
25-09-2021, 17:11
alex_moscow, обратите внимание на сторонние файловые менеджеры — Total Commander, Far Manager и т.п.

alex_moscow
25-09-2021, 17:30
Еще вопрос, обнаружил , что ваш скрипт не захватывает файлы, находящиеся в каталогах с пробелами , русской раскладкой и если есть восклицательный знак в имени архива.
Это долго исправить или проще переименовать каталоги ?
И rar файлы файлы все игнорируются, их не много, но выдает ошибку. 7za.exe видимо не умеет с таким синтаксисом. rar старой версии до 2010 года.

megaloman
25-09-2021, 18:37
Iska, Не очень понял, что такое 7za.exe? Насколько он официален? Можно ли его заменить на 7z.exe? У меня при такой замене Ваш скрипт не отрабатывает. @Echo Off
Set "BoxIn=Z:\Box_In"
Set Mask="*.zip" "*.rar" "*.7Z"

Set "Arc=C:\Program Files\7-Zip\7z.exe"

Pushd "%BoxIn%" ||(Echo Folder "%BoxIn%" not found &Pause &Exit /B 1)
>"%~nx0.arc.tmp" (For /F "usebackq delims=" %%a In (`2^>nul Dir %Mask% /B /A:- /S`) Do Echo %%a)
For /F "usebackq delims=" %%a In ("%~nx0.arc.tmp") Do (
2>nul Md "%%~dpna"
>nul "%Arc%" e "%%a" -o"%%~dpna" -y &&Del "%%a"
Set /a N=0
For /F "usebackq delims=" %%f In (`2^>nul Dir "%%~dpna\*.*" /B /A:-D /S`) Do Call Set /A N+=1
Call :OneFile %%N%% "%%~dpna" "%%~dpa"
)

Del "%~nx0.arc.tmp"
Popd
Exit /B 0

:OneFile
If %1==1 >nul Move /Y "%~2\*.*" "%~3\" &&2>nul Rd %2
Exit /BНа всякий случай мою тестовую папку Box_In прилагаю (там всякая случайная билиберда)

alex_moscow
25-09-2021, 18:41
Это консольная версия, с расширенными возможностями от авторов и создателей 7z
https://www.7-zip.org/download.html доступен на общей странице

alex_moscow
25-09-2021, 18:54
"""Не очень понял, что такое 7za.exe? Насколько он официален?"""
это консольная , расширенная версия 7z от официального разработчика. Доступна на основной странице download.
UPD продублировал, думал то сообщение удалили из за ссылки.

Можно подробнее, твой скрипт распаковывает и удаляет сразу ? понимает ли он rar и другие пробелы и символы (тут что привели выше не понимает воскл знаки)?

Iska
25-09-2021, 18:56
в каталогах с пробелами »
Подтверждаю.

русской раскладкой »
Не подтверждаю.

и если есть восклицательный знак в имени архива. »
Подтверждаю.

И rar файлы файлы все игнорируются, их не много, но выдает ошибку. 7za.exe видимо не умеет с таким синтаксисом. »
Подтверждаю. Видимо, придётся пользовать полную инсталляцию 7-Zip'а.

Пробуйте:
@echo off
setlocal enableextensions disabledelayedexpansion

set sSourceFolder=c:\temp
set sPath27Zip=%ProgramFiles%\7-Zip\7z.exe

pushd "%sSourceFolder%" && (
for /f "usebackq delims=" %%i in (`2^>nul dir /b /a:-d /s "*.zip" "*.7z" "*.rar"`) do (
echo [%%~fi]
"%sPath27Zip%" t "%%~i" | >nul find.exe /i "Files:" ^
&& ( >nul "%sPath27Zip%" x "%%~i" -y -o"%%~dpni" && del /f /q "%%~i" ) ^
|| ( >nul "%sPath27Zip%" x "%%~i" -y -o"%%~dpi" && del /f /q "%%~i" )
)
popd
) || (
echo Folder [%sSourceFolder%] not found.
exit /b 1
)

endlocal
exit /b 0


что такое 7za.exe? »
standalone-версия 7-Zip. К сожалению, как оказалось, не поддерживает работу с архивами RAR.

megaloman
25-09-2021, 19:16
alex_moscow, Распаковывает, удаляет, если в архиве 1 файл, он получается без папки. Пробелы и ! ему ни по чём, испытан на архивах "*.zip" "*.rar" "*.7Z", единственное, пропишите свой путь для исходной папки и архиватора. Если в переменных скрипта будут кириллические символы - извольте сохранить скрипт в 866 кодировке, или, в принципе, можно доработать и для кодировки 1251.
@Echo Off
>nul Chcp 1251
Set "BoxIn=Z:\Ночной эфир струит зефир"
................
................

alex_moscow
25-09-2021, 19:41
to megaloman прямо сейчас тестирую ваш скрипт на 60 гиговой папке с 150 тыс архивами. Пока все ровно, единственно что не читабельно в процессе, но это не важно. Вам большое спасибо что поделились. Про 866 кодировку буду тестировать позже из notepada++
to Iska ваша версия теперь:
rar распаковывает
символы пробела и восклицательного знака понимает
И я так понимаю сразу удаляет.

я считаю вопрос решен, двумя скриптами, сохранил оба - огромЕнное вам спасибо.

megaloman
26-09-2021, 16:11
Пока все ровно, единственно что не читабельно в процессе »@Echo Off
>nul Chcp 1251
Set "BoxIn=Z:\Ночной эфир струит зефир"
Set Mask="*.zip" "*.rar" "*.7Z"

Set "Arc=C:\Program Files\7-Zip\7z.exe"

Pushd "%BoxIn%" ||(Echo Folder "%BoxIn%" not found &Pause &Exit /B 1)
Set /A Mall=0
>"%~nx0.arc.tmp" (For /F "usebackq delims=" %%a In (`2^>nul Dir %Mask% /B /A:- /S`) Do (Echo %%a&Call Set /A Mall+=1))

Set /A M=0
2>"___________%~nx0.arc.err" (For /F "usebackq delims=" %%a In ("%~nx0.arc.tmp") Do (
Call Set /A M+=1
Call Echo %%M%%/%Mall% "%%a"
2>nul Md "%%~dpna"
>nul "%Arc%" e "%%a" -o"%%~dpna" -y &&Del "%%a"
Set /a N=0
For /F "usebackq delims=" %%f In (`2^>nul Dir "%%~dpna\*.*" /B /A:-D /S`) Do Call Set /A N+=1
Call :OneFile %%N%% "%%~dpna" "%%~dpa"
))

Del "%~nx0.arc.tmp"
Popd
pause
Exit /B 0

:OneFile
If %1==1 >nul Move /Y "%~2\*.*" "%~3\" &&2>nul Rd %2&Exit /B
If %1==0 2>nul Rd %2
Exit /B




© OSzone.net 2001-2012