Показать полную графическую версию : [решено] Распаковка архивов в поддиректории с теми же именами
NuclearBox
09-06-2018, 08:10
Здравствуйте.
Нужен батник, который в директории, где он лежит, ищет архивы, и распаковывает их там же в подпапки с именами архивов (распаковать в "/"), с перезаписью, если такие папки и файлы уже есть.
Лучше с помощью консольной 7za.exe. Архивы могут иметь разные расширения. Но если будет код для zip-архивов, то можно будет дополнить батник аналогичным кодом для архивов с другими расширениями.
и распаковывает их там же в подпапки с именами архивов (распаковать в "/") »
Из этой фразы непонятно: каталоги с распакованными архивами должны создаваться именно в той же папке, где лежит батник — или где-то ещё, в какой-то мифической "/"?
NuclearBox
09-06-2018, 10:21
mwz, верный первый вариант - в той же папке, где лежит батник.
Если батник лежит в каталоге "FOLDER", то он должен найти в "FOLDER" все файлы архивов .zip (например).
Допустим, в "FOLDER" кроме прочих файлов и папок находится два архива - f1.zip и f2.zip
Батник должен их распаковать соответственно в папки "FOLDER/f1/" и "FOLDER/f2/", с перезаписью, если такие файлы и папки уже есть.
"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\"
)
на 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
)
Вопрос решен, всё работает как надо.
Спасибо, уважаемые, за помощь и науку!
NuclearBox,
если запуск из папки с архивами и в path прописан путь к 7z, то достаточно:
for /f "delims=" %%a in ('dir /a-d/b') do 7z x "%%a" -o"%%~na" -y
распакует все архивы что сможет (а может ой как немало), на не архивы (например тот же bat в этой папке) ругнется в окне и проигнорирует (но не остановится и не вылетит)
распакует все архивы что сможет (а может ой как немало) »
Каааак пойдёт все найденные документы Office распаковывать ;). Не?
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, радикальный вариант (где батник ругается на не архивные файлы) тоже интересен - пришла идея применить эту конструкцию в других целях, с утилитами-конвертерами. Спасибо!
где батник ругается на не архивные файлы »
не батник (просто в его окне) - 7zip, (на всякий случай)
NuclearBox
10-06-2018, 23:22
alpap, ну да, ну да...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.