Показать полную графическую версию : Подскажите скрипт для пакетной распаковки, чт каталог создавался если файлов больше 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
Заранее спасибо за ответы.
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 - значит распаковываем их в свой каталог с именем архива
Если файл в архиве один - значит его распаковываем в корень пути. папку не создавать.
Ну и бонусом удалить все архивы после распаковки.
Пробуйте. Пока без удаления. Обратите внимание, что используется 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
спасибо большое !!! отлично, все работает. удаление архивов надо делать в цикле или просто одной строкой в конце ?
Пробуйте:
@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 софтом в приличный вид.
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 и другие пробелы и символы (тут что привели выше не понимает воскл знаки)?
в каталогах с пробелами »
Подтверждаю.
русской раскладкой »
Не подтверждаю.
и если есть восклицательный знак в имени архива. »
Подтверждаю.
И 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.