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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Подскажите скрипт для пакетной распаковки, чт каталог создавался если файлов больше 1 (http://forum.oszone.net/showthread.php?t=349687)

alex_moscow 25-09-2021 12:57 2967480

Подскажите скрипт для пакетной распаковки, чт каталог создавался если файлов больше 1
 
Всем привет. Буду очень признателен, если подскажете пример кода для 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 2967481

alex_moscow, примеры тех и других архивов приведите. А то непонятно, каким образом связаны файл info и каталог info.

alex_moscow 25-09-2021 14:03 2967482

пример каталог внутри архивы и папки с архивами
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 2967484

Пробуйте. Пока без удаления. Обратите внимание, что используется 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 2967486

спасибо большое !!! отлично, все работает. удаление архивов надо делать в цикле или просто одной строкой в конце ?

Iska 25-09-2021 15:53 2967487

Пробуйте:
Скрытый текст
Код:

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

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

Iska 25-09-2021 17:11 2967490

alex_moscow, обратите внимание на сторонние файловые менеджеры — Total Commander, Far Manager и т.п.

alex_moscow 25-09-2021 17:30 2967492

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

megaloman 25-09-2021 18:37 2967499

Вложений: 1
Iska, Не очень понял, что такое 7za.exe? Насколько он официален? Можно ли его заменить на 7z.exe? У меня при такой замене Ваш скрипт не отрабатывает.
Мой вариант с 7-Zip 19.00 (x86) : Copyright (c) 1999-2018 Igor Pavlov : 2019-02-21
Код:

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

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

alex_moscow 25-09-2021 18:54 2967507

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

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

Iska 25-09-2021 18:56 2967508

Цитата:

Цитата alex_moscow
в каталогах с пробелами »

Подтверждаю.

Цитата:

Цитата alex_moscow
русской раскладкой »

Не подтверждаю.

Цитата:

Цитата alex_moscow
и если есть восклицательный знак в имени архива. »

Подтверждаю.

Цитата:

Цитата alex_moscow
И 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



Цитата:

Цитата megaloman
что такое 7za.exe? »

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

megaloman 25-09-2021 19:16 2967512

alex_moscow, Распаковывает, удаляет, если в архиве 1 файл, он получается без папки. Пробелы и ! ему ни по чём, испытан на архивах "*.zip" "*.rar" "*.7Z", единственное, пропишите свой путь для исходной папки и архиватора. Если в переменных скрипта будут кириллические символы - извольте сохранить скрипт в 866 кодировке, или, в принципе, можно доработать и для кодировки 1251.
Код:

@Echo Off
>nul Chcp 1251
        Set "BoxIn=Z:\Ночной эфир струит зефир"
................
................


alex_moscow 25-09-2021 19:41 2967520

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

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

megaloman 26-09-2021 16:11 2967574

Цитата:

Цитата alex_moscow
Пока все ровно, единственно что не читабельно в процессе »

Сделал отображение обрабатываемых архивов, лог ошибок
Код:

@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



Время: 23:44.

Время: 23:44.
© OSzone.net 2001-