Войти

Показать полную графическую версию : [решено] Извлечь из архива только определенную папку/определенный файл


Страниц : 1 [2]

Radif Suharik
02-02-2014, 22:14
Вот ссылка.

Iska
02-02-2014, 22:58
И еще вопросик,может не по теме »
Причём дважды:


один вопрос — одна тема;
пишите в личку (http://forum.oszone.net/private.php?do=newpm&u=122633) автору, а не здесь.

mariolast
08-08-2017, 07:56
Тоже интересен подобный вопрос. Нужно средствами самораспаковывающегося 7Z SFX Извлечь содержимое двух папок в одну общую. Например в архиве есть две папки "Common" и "x86", нужно слить содержимое их в одну не нарушая внутреннеей структуры. Как ни страннно, средствами коммандной строки оптимального решения не нашел. Есть только возможность распаковать все и скопирповать, а это очень затратно по времени, если содержимое папок большое по объёму.

Iska
08-08-2017, 08:16
mariolast, подготовьте пример такого архива небольшого объёма.

mariolast
08-08-2017, 20:37
Вот небольшой архив. В реале полгига каждая папка
Нужно все из папки Common переместить в папку x64
https://mega.nz/#!FmA1BbQb!hjiR-DwhA76q6h7-rdI7ZIv-XVk_SyvZKNV-AFP3dbQ

megaloman
09-08-2017, 00:33
@Echo Off

Set "ArcFile=Z:\Box_Arc\Archive.7z"
Set "Arc=C:\Program Files\7-Zip\7zG.exe"
Set "ArcKey=x -r"

Set "BoxOut=Z:\Box_Out"

rem 1 2 3 4 5 6 7
Call :FromArc "%Arc%" "%ArcKey%" "%ArcFile%" "%BoxOut%" "x64" "Common" "x64"

GoTo :Eof

:FromArc
Md "%~4\%~nx0.tmp" >nul 2>&1
Pushd "%~4\%~nx0.tmp"
:Begin
%1 %~2 %3 "%~6\"
Call :DirMove "%~4\%~nx0.tmp\%~6" "%~4\%~5"
Shift /6
If Not "%6"=="" GoTo :Begin
Popd
RD "%~4\%~nx0.tmp" >nul 2>&1
GoTo :Eof

:DirMove
xcopy /T /E /I /Y %1 %2

FOR /F "usebackq delims=" %%i IN (`xcopy /E /Y /I /L /F "%~1\*.*" %2`) DO Call :AllMove "%%i"
For /F "usebackq delims=" %%i In (`Dir "%~1\*.*" /B /S /A:D 2^>nul^|Sort /R`) Do RD "%%i" 2>nul
RD %1 2>nul
GoTo :Eof

:AllMove
Set Twin=%1
Set Twin=%Twin: -> =" "%
Move /Y %Twin% >nul 2>&1
GoTo :Eof Вызывается процедура :FromArc
1. Архиватор "%Arc%"
2. С ключами "%ArcKey%"
3. Обработает архивный файл "%ArcFile%"
4. Результат получим в папке "%BoxOut%"
5. Разархивированные указанные папки будут слиты в одной подпапке этой папки (здесь пример "x64")
6, 7... Из архива разархивируем только указанные папки, (здесь пример "Common" "x64", можно продолжить при желании перечисление папок)

mariolast
09-08-2017, 13:35
Ну...тут тоже двойная работа получается, делаю как раз для 7Z sfx, извлекать из него, потом еще раз разархивировать. Придется наверное таки через move делать

Iska
09-08-2017, 14:57
mariolast, напрямую ни через сам sfx, ни через 7z.exe, ни даже через standalone 7za.exe не выйдет — банально отсутствует необходимый функционал.

megaloman
09-08-2017, 16:24
mariolast, подготовьте пример такого архива небольшого объёма. »А Вы что выдали? Извлечь содержимое двух папок в одну общую. »Это и сделано. И именно посредством move. Вы что, внутри архива хотите слить две папки? Имхо, не выйдет.

Iska
09-08-2017, 17:24
Вы что, внутри архива хотите слить две папки? »
Насколько я понял — нет. Было желание извлечь содержимое одной папки «X» из архива в указанный каталог «Z» (включая саму папку), извлечь содержимое другой папки «Y» из архива в тот же самый каталог «Z» вовнутрь ранее извлечённой папки «X» (не включая саму папку «Y», а только её содержимое), заменяя ранее извлечённое, и всё это — средствами самого sfx.

megaloman
09-08-2017, 17:53
средствами самого sfx » Если в архиве нет иных папок, кроме исходных для слияния, то вообще не вижу большого смысла в такой постановке задачи - при больших архивах время на разархивацию много больше, чем время на перемещение посредством move распакованного в общую папку на том же диске. Если есть иные папки, то и sfx-архив можно распаковать и 7zG.exe, конечно, тогда и смысл иметь sfx-архив теряется. Кстати, не сумел подавить запрос на определение целевой папки для разархивации при запуске екзешника sfx-архива

mariolast
09-08-2017, 20:32
Суть сего в следующем.
Есть распакованные инсталляторы программы, 32 и 64 битные версии, для каждой свой. Лежат соотв. в папках x86 и x64. Размер каждой примерно 500Мб. С помощью sfx делается установка программы, определяется битность и после распаковки запускается инсталлятор либо из x64 либо из x86. Это все стандартно. Размер sfx инсталлятора составил 330Мб. Но еще задумка уменьшить размер sfx инсталлятора. Для это понаходил все одинаковые по содержимому, размеру и названию файлы, которые есть у обоих папках инсталлятора x86 и x64. И вынес их в отдельную папку Common. Получилось где то на 500Мб. Таким образом удалось уменьшить вес на 500Мб, так как удалил по 500Мб из x86 и x64 и создал одну папку Common на 500Мб. Таким образом в конечном sfx инсталляторе после создания получается где то 270Мб. Выигрыш в 60Мб и меньшее количество файлов в архиве, что положительно сказывается и на скорости распаковки. Теперь застопорился на том, как после запуска и распаковки инсталлятора в темповую папку обьединить папки скажем x86 и Common, потому как для запуска инсталлятора в папке ч86 ему надо дозаписать те 500Мб, которые перенес в папку Common.
Для создания инсталляторов пользуюсь InnoSetup, там это без проблем, что куда распаковать, но он не умеет так ужимать, мало параметров.
Думал что сам 7zip умеет определять одинаковые файлы и сжимать раз и записывать местоположение для распаковки. По разному игрался. Особо эффекта не дало, решил попробовать вот таким методом.

sov44
09-08-2017, 21:11
mariolast, сначала переносим содержимое папки Common в папку разрядности системы, затем запуск исполнительного файла

RunProgram="%%P:hidcon:cmd /c \"move Common\\* %%P\\\""
RunProgram="%%P\\install.exe"

mariolast
09-08-2017, 21:50
sov44, затык в том, что если в папке х86 есть папка 1 и в папке Common есть папка 1, то при переносе получаем Отказано в доступе.

mariolast
09-08-2017, 22:34
Пока смотрю в сторону AutoIT с его функцией DirMove ( "source dir", "dest dir" [, flag = 0 ] )
Там это делается без проблем за секунду. Но если что то можно придумать скриптом, буду рад за помощь,




© OSzone.net 2001-2012