Компьютерный форум 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=335252)

NuclearBox 09-06-2018 08:10 2817551

Распаковка архивов в поддиректории с теми же именами
 
Здравствуйте.
Нужен батник, который в директории, где он лежит, ищет архивы, и распаковывает их там же в подпапки с именами архивов (распаковать в "/"), с перезаписью, если такие папки и файлы уже есть.
Лучше с помощью консольной 7za.exe. Архивы могут иметь разные расширения. Но если будет код для zip-архивов, то можно будет дополнить батник аналогичным кодом для архивов с другими расширениями.

mwz 09-06-2018 10:09 2817565

Цитата:

Цитата NuclearBox
и распаковывает их там же в подпапки с именами архивов (распаковать в "/") »

Из этой фразы непонятно: каталоги с распакованными архивами должны создаваться именно в той же папке, где лежит батник — или где-то ещё, в какой-то мифической "/"?

NuclearBox 09-06-2018 10:21 2817573

mwz, верный первый вариант - в той же папке, где лежит батник.
Если батник лежит в каталоге "FOLDER", то он должен найти в "FOLDER" все файлы архивов .zip (например).
Допустим, в "FOLDER" кроме прочих файлов и папок находится два архива - f1.zip и f2.zip
Батник должен их распаковать соответственно в папки "FOLDER/f1/" и "FOLDER/f2/", с перезаписью, если такие файлы и папки уже есть.

mwz 09-06-2018 11:07 2817581

Цитата:

Цитата NuclearBox
"FOLDER/f1/" и "FOLDER/f2/" »

А, вы использовали *nix-запись. В Windows это будет:
"FOLDER\f1\" и "FOLDER\f2\"

megaloman 09-06-2018 12:07 2817598

NuclearBox, Мне привычнее RAR, на примере WinRar
Код:

@Echo Off
Set Mask="*.zip" "*.rar"
Set "ARC="C:\Program Files\WinRAR\WinRAR.exe" x"

FOR %%f IN (%Mask%) DO (
        Md "%%~nf" 2>nul
        %ARC% "%%f" "%%~nf\"
)


alpap 09-06-2018 14:40 2817629

на zip не сложнее
Код:

@echo off
set "d=C:\Folder"
set "ar=%ProgramFiles%\7-Zip\7z.exe"
set "exp=7z"

pushd "%d%"
 for /f "delims=" %%a in ('dir /a-d/b "*.%exp%"') do "%ar%" x "%%a" -o"%%~na" -y
popd
pause


NuclearBox 09-06-2018 16:21 2817636

megaloman, alpap, большое спасибо! Снова выручаете.

С конструкцией кода разобрался, подправил с учетом нюансов.
Предустановленный архиватор Winzip или 7-Zip использовать не предполагается.
Вторым файлом с батником в рабочую папку отправится консольный архиватор 7za.exe.
Путь к рабочей папке прописывать не хочется, он может/будет меняться.
Внес мелкие изменения, убрал пути и получил два варианта:

Вариант alpap:
Код:

@echo off
set "d=%~dp0"
set "ar=7za.exe"
set "exp=zip"

pushd "%d%"
 for /f "delims=" %%a in ('dir /a-d/b "*.%exp%"') do %ar% x "%%a" -o"%%~na" -y
popd

Тут надо дописывать аналогичные блоки для архивов rar, 7z и т.д.
Поэтому чуть удобнее конструкция megaloman, где можно сразу перечислить все нужные архивы по маске:
Код:

@Echo Off
Set Mask="*.7z" "*.rar" "*.zip"
Set "ARC="7za.exe" x"

FOR %%f IN (%Mask%) DO (
        Md "%%~nf" 2>nul
        %ARC% "%%f" -o"%%~nf\" -y
)

Вопрос решен, всё работает как надо.
Спасибо, уважаемые, за помощь и науку!

alpap 10-06-2018 01:26 2817721

NuclearBox,
если запуск из папки с архивами и в path прописан путь к 7z, то достаточно:
Код:

for /f "delims=" %%a in ('dir /a-d/b') do 7z x "%%a" -o"%%~na" -y
распакует все архивы что сможет (а может ой как немало), на не архивы (например тот же bat в этой папке) ругнется в окне и проигнорирует (но не остановится и не вылетит)

Iska 10-06-2018 01:36 2817722

Цитата:

Цитата alpap
распакует все архивы что сможет (а может ой как немало) »

Каааак пойдёт все найденные документы Office распаковывать ;). Не?

alpap 10-06-2018 01:50 2817723

Iska,
это да, по любому, предполагал наличие только разнообразных распространенных архивов да может пару файлов txt, но конечно лучше все же, если нет уверенности в содержимом директории прописать возможные расширения и это тоже легко сделать сделать добавив их под dir
Код:

...('dir /a-d/b "*.7z" "*.rar" "*.zip"')...
вообще, если увеличить несколько масштабы кода, можно сделать вариант для перебора всех возможных расширений установленной по штатному пути 7z
(надеюсь путь к dll и файлу string.txt действительно не отличается в зависимости от версий - не проверял)
Код:

@echo off
set "d=C:\Folder"
set "ar=%ProgramFiles%\7-Zip\7z.exe"

call :r
pushd "%d%"
 for /f "delims=" %%a in ('dir /a-d/b %exp%') do "%ar%" x "%%a" -o"%%~na" -y
popd
pause& exit

:r
 "%ar%" x "%Programfiles%\7-Zip\7z.dll" -o$ "string.txt" -r
 for /f "delims=" %%f in ('dir /a-d/b/s "$\string.txt"') do (
  <"%%f" (for /f "delims=" %%a in ('find /n /v ""') do @>nul chcp 866& set "x=%%a"& cmd /v/c set "x=!x:*]^^=!")
 )
 for %%x in (%x%) do echo %%x|>nul find ":" && for /f "delims=:" %%a in ("%%x") do >>+<+ set /p exp=""*.%%a" "
 >nul 2>&1 del /q +& >nul 2>&1 rd /s /q $
exit /b


NuclearBox 10-06-2018 21:22 2817797

alpap, радикальный вариант (где батник ругается на не архивные файлы) тоже интересен - пришла идея применить эту конструкцию в других целях, с утилитами-конвертерами. Спасибо!

alpap 10-06-2018 23:21 2817816

Цитата:

Цитата NuclearBox
где батник ругается на не архивные файлы »

не батник (просто в его окне) - 7zip, (на всякий случай)

NuclearBox 10-06-2018 23:22 2817817

alpap, ну да, ну да...


Время: 11:18.

Время: 11:18.
© OSzone.net 2001-