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

SharkyEXE 13-07-2013 16:58 2184176

Извлечь из архива только определенную папку/определенный файл
 
Здравствуйте.
Пожалуйста, если это возможно, напишите мне, как при помощи *.bat или *.cmd файла из архива UpdatePack-XPSP3-Rus-13.6.15.7z (Наборы - UpdatePack-XPSP3-Rus версия 13.6.15) в папку C:\1 извлечь только папку Addons с сохранением структуры папки Addons
То есть на выходе получаем папку C:\1, в которой находиться только папка Addons с сохранением структуры папки Addons. Больше ничего, кроме папки Addons в папке C:\1 не должно быть.
Спасибо.

sunnykey 13-07-2013 17:10 2184181

Распаковать архив во временную папку, скопировать нужный объект, удалить лишнее

SharkyEXE 13-07-2013 17:29 2184186

Цитата:

Цитата sunnykey
Распаковать архив во временную папку, скопировать нужный объект, удалить лишнее »

Не оптимальный способ. Это затратно по времени.
То, что Вы предлагаете, итого 3 действия - это самый долгий путь.
Средний по времени путь: распаковать полностью весь архив+удалить лишнее, итого 2 действия.
Самый оптимальный по времени путь, то, что мне хочется - распаковать только одну нужную мне папку, итого 1 действие.
Чем меньше действий - тем быстрее результат.
Спасибо.

Iska 13-07-2013 18:58 2184209

Я, собственно, не понял, в чём состоит проблема?
Код:

"%ProgramFiles%\7-Zip\7z.exe" x "D:\Install\UpdatePack-XPSP3-Rus\UpdatePack-XPSP3-Rus 13.6.15\UpdatePack-XPSP3-Rus-13.6.15.7z" "Addons\*" -o"C:\1"

SharkyEXE 13-07-2013 20:16 2184237

Цитата:

Цитата Iska
Я, собственно, не понял, в чём состоит проблема?
Код: »

Большое Вам спасибо за помощь.
Как раз этот код мне и был нужен.
Попутный вопрос: а возможно извлечь только все файлы, находящиеся на одном уровне с папкой Addons и папкой Files без распаковки папок Addons и Files?
Спасибо.

Iska 13-07-2013 20:24 2184239

Цитата:

Цитата SharkyEXE
Попутный вопрос: а возможно извлечь только все файлы, находящиеся на одном уровне с папкой Addons и папкой Files без распаковки папок Addons и Files? »

Поясните Ваш вопрос на примере существующего файла «UpdatePack-XPSP3-Rus-13.6.15.7z».

SharkyEXE 13-07-2013 20:27 2184242

Цитата:

Цитата Iska
Поясните Ваш вопрос на примере существующего файла «UpdatePack-XPSP3-Rus-13.6.15.7z». »

Из архива UpdatePack-XPSP3-Rus-13.6.15.7z (Наборы - UpdatePack-XPSP3-Rus версия 13.6.15) в папку C:\1 извлечь только файлы
читать дальше »
Код:

7zr.exe
ChkDistr
Compress
Distr.ini
Dosnet
getsect.exe
Hive
Html.nfo
makecab.exe
sfcpatch.exe
SpecCase
Support.exe
SvcTmpl
Sysoc
Thanks
Txtsetup
_HISTORY.MHT
_README.MHT
__PATCH.CMD


Iska 13-07-2013 20:32 2184246

SharkyEXE, например, так:
Код:

"%ProgramFiles%\7-Zip\7z.exe" x "D:\Install\UpdatePack-XPSP3-Rus\UpdatePack-XPSP3-Rus 13.6.15\UpdatePack-XPSP3-Rus-13.6.15.7z" "*" -x!"Addons" -x!"Files" -o"C:\1"

SharkyEXE 13-07-2013 20:54 2184249

Цитата:

Цитата Iska
SharkyEXE, например, так: »

Большое Вам спасибо. То, что надо и всё работает. :good:

Radif Suharik 01-02-2014 16:23 2300638

Здравствуйте.Подскажите,пожалуйста код для батника что бы извлечь все файлы с папок в одну.Ситуация такая:скачал все обновления с сайта обновлений Microsoft и каждая обнова в отдельной папке(диск D\Windows Update\Update x64 Win 8 и в ней уже папки с обновами),а что бы их установить,например с помощью Windows 7 Update Pack Tool нужно их сложить в одну общую папку тем самым извлечь каждую со своей папки и бросить в общую(я сделал такой путь-D:\Проги\Windows Update\Windows 7 Update Pack Tool\Updates)Помогите мне пожалуйста,а то если я их по одной буду перекидывать в свободное время,у меня не одна неделя на это уйдет.

Iska 01-02-2014 17:11 2300669

Что внутри папок? Покажите пару примеров.

Radif Suharik 01-02-2014 17:46 2300695

в левой стороне я уже перекидывал в ручную...

Radif Suharik 01-02-2014 17:52 2300700

Еще одна...

Radif Suharik 01-02-2014 17:54 2300703

Вот

Iska 01-02-2014 19:41 2300779

Radif Suharik, правильно ли я понимаю: Вам нужно перебрать все папки первого уровня, вложенные в папку «Update x64 Win8», найти в них все файлы *.exe и *.msu, затем скопировать эти файлы в папку «…\Windows 7 Update Pack Tool\Updates»?

Radif Suharik 01-02-2014 20:53 2300814

Точно.

Iska 02-02-2014 08:18 2301028

Radif Suharik, в таком случае, Вам не нужен скрипт.
  • Открываете в Проводнике папку «D:\Windows Update\Update x64 Win 8».
  • Нажимаете «F3» (или Ctrl-F, или Ctrl-E, или щёлкаете кнопку «Поиск» на панели инструментов Проводника [я вижу, у Вас её нет], или выбираете в меню Проводника \Вид\Панели обозревателя\Поиск).
  • В открывшейся панели поиска в поле «Искать имена файлов или папок» вводите «*.exe;*.msu», нажимаете кнопку «Найти».
  • Нажимаете «Ctrl-A» (или в меню Проводника \Правка\Выделить всё)
  • Далее любым способом (\Правка\Копировать+\Правка\Вставить в «D:\Проги\Windows Update\Windows 7 Update Pack Tool\Updates»; \Правка\Копировать в папку; Drag-n-Drop в папку «D:\Проги\Windows Update\Windows 7 Update Pack Tool\Updates», удерживая «Ctrl» и т.п.) копируете выделенные файлы в папку «D:\Проги\Windows Update\Windows 7 Update Pack Tool\Updates».
В Вашей версии ОС названия элементов и принципы работы могут отличаться. Но общий путь будет тот же: найти, скопировать и вставить.

Radif Suharik 02-02-2014 13:42 2301147

Вложений: 1
Спасибо,можно попробовать...Но мне тут программку подкинули,она в принципе и решила мою проблеме,если кому будет интересно...

Iska 02-02-2014 14:42 2301181

Radif Suharik, какой смысл в отдельной «программке» при наличии встроенных средств, позволяющих выполнить искомое в несколько нажатий клавиш, равно как и кучи сторонних файловых менеджеров, делающих сие ещё быстрее и проще?!

Radif Suharik 02-02-2014 22:07 2301492

Ну не знаю...Это,наверно кому как удобно...И еще вопросик,может не по теме,но все же...Была на сайте темка-http://forum.oszone.net/thread-251886-2.html так вот там была программа для установки моих многострадальных обновлений-UpdatePack-13.6.16,но скачать ее не получается-помогите пожалуйста,подкинте.Если что то не не так-прошу простить,просто хотелось бы с ней попробовать,а найти не получается.

Radif Suharik 02-02-2014 22:14 2301495

Вложений: 1
Вот ссылка.

Iska 02-02-2014 22:58 2301520

Цитата:

Цитата Radif Suharik
И еще вопросик,может не по теме »

Причём дважды:
  • один вопрос — одна тема;
  • пишите в личку автору, а не здесь.

mariolast 08-08-2017 07:56 2757050

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

Iska 08-08-2017 08:16 2757053

mariolast, подготовьте пример такого архива небольшого объёма.

mariolast 08-08-2017 20:37 2757239

Вот небольшой архив. В реале полгига каждая папка
Нужно все из папки Common переместить в папку x64
https://mega.nz/#!FmA1BbQb!hjiR-DwhA...yvZKNV-AFP3dbQ

megaloman 09-08-2017 00:33 2757287

Если нужно все из папки Common переместить в папку x64, то:
Код:

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

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

Iska 09-08-2017 14:57 2757380

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

megaloman 09-08-2017 16:24 2757397

Цитата:

Цитата Iska
mariolast, подготовьте пример такого архива небольшого объёма. »

А Вы что выдали?
Цитата:

Цитата mariolast
Извлечь содержимое двух папок в одну общую. »

Это и сделано. И именно посредством move. Вы что, внутри архива хотите слить две папки? Имхо, не выйдет.

Iska 09-08-2017 17:24 2757405

Цитата:

Цитата megaloman
Вы что, внутри архива хотите слить две папки? »

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

megaloman 09-08-2017 17:53 2757410

Цитата:

Цитата Iska
средствами самого sfx »

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

mariolast 09-08-2017 20:32 2757438

Суть сего в следующем.
Есть распакованные инсталляторы программы, 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 2757447

mariolast, сначала переносим содержимое папки Common в папку разрядности системы, затем запуск исполнительного файла
Код:

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


mariolast 09-08-2017 21:50 2757453

sov44, затык в том, что если в папке х86 есть папка 1 и в папке Common есть папка 1, то при переносе получаем Отказано в доступе.

mariolast 09-08-2017 22:34 2757461

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


Время: 15:41.

Время: 15:41.
© OSzone.net 2001-