PDA

Показать полную графическую версию : [решено] Распаковка архивов в поддиректории с теми же именами


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

mwz
09-06-2018, 10:09
и распаковывает их там же в подпапки с именами архивов (распаковать в "/") »

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

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

mwz
09-06-2018, 11:07
"FOLDER/f1/" и "FOLDER/f2/" »

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

megaloman
09-06-2018, 12:07
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
на 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
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
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
распакует все архивы что сможет (а может ой как немало) »
Каааак пойдёт все найденные документы Office распаковывать ;). Не?

alpap
10-06-2018, 01:50
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
alpap, радикальный вариант (где батник ругается на не архивные файлы) тоже интересен - пришла идея применить эту конструкцию в других целях, с утилитами-конвертерами. Спасибо!

alpap
10-06-2018, 23:21
где батник ругается на не архивные файлы »
не батник (просто в его окне) - 7zip, (на всякий случай)

NuclearBox
10-06-2018, 23:22
alpap, ну да, ну да...




© OSzone.net 2001-2012