View previous topic :: View next topic |
Author |
Message |
Saarilainen
Joined: 05 Feb 2010 Posts: 15
|
(Separately) Posted: Fri Feb 05, 2010 14:01 Post subject: [script request] Распаковка/запаковка офисных файлов |
|
|
Для последующей более плотной упаковки файлов 2007-го офиса, которые представляют из себя zip-архивы, нужен скрипт, который ищет эти файлы в выделенных каталогах рекурсивно по заданным расширениям, распаковывает в одноимённые папки с этими же расширениями в названии (через подчеркушку _ ), удаляет после успешной распаковки оригинальные файлы. И второй скрипт - осуществляющий обратные действия: ищет рекурсивно в выделенных каталогах папки с подчеркушками, упаковывает их содержимое в зипы, присваивает зипам имя и расширение из названия исходной папки, после чего удаляет папки с подчеркушками. Во избежание ошибок удобнее наверное заранее задать все возможные расширения в файле-списке (xlsx; xlsm; docx; pptx... ). |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
|
Back to top |
|
|
Saarilainen
Joined: 05 Feb 2010 Posts: 15
|
(Separately) Posted: Fri Feb 05, 2010 15:11 Post subject: |
|
|
MVV wrote: | проще было бы написать один скрипт - который проходил бы по директориям и делал оба действия сразу - распаковывал и тут же упаковывал |
можно действительно написать скрипт для отлова таких файлов и более плотного пережатия 7zip'ом. Ну просто есть более эффективные методы, заточенные под каждый тип - и с точки зрения степени сжатия выгоднее предварительно расжать zip-потоки (разница по размеру примерно в 2 раза). Встречал в сети самописные утилитки, которые разжимают игровые ресурсы COD (которые тоже из себя представляют zip-архивы), но там пути нужно руками прописывать, что не очень удобно. Юзабельность в том чтобы именно в выделенных каталогах поиск осуществлялся.
А в настройках офиса степень сжатия не задать, она по умолчанию средняя. Если перепаковать 7zipом или ТС'ом тот же xlsx в zip с максимальными настройками, то офисом он открывается без проблем |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Fri Feb 05, 2010 16:07 Post subject: |
|
|
Если открывается после пережатия - отлично. Кстати, сам смотрел, у ОпенОфиса в архиве базы данных файлы по умолчанию хранятся без сжатия.
Вообще, задача решается простеньким bat-файликом, можно двумя.
enumer.bat
Code: | @echo off
set enum_types=*.docx;*.xls?;*.pptx
if not -%1==- set enum_types=%1
for /r %%f in (%enum_types%) do call %0\..\repacker.bat "%%f"
|
(можно дописать еще масок для файлов офиса в файл, или передавать как параметр)
repacker.bat
Репакер тестовой версии будет просто писать в консоль путь к файлу. Остается лишь разобрать параметры командной строки архиватора и запустить в репакере распаковку и упаковку обратно содержимого переданного файла. Можно предварительно запускать архиватор для отображения содержимого архива (можно выводить в nul) и проверять код возврата - если файл не является архивом, пропускать его. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
|
Tol!k
Joined: 01 Apr 2008 Posts: 1727 Location: Арзамас
|
(Separately) Posted: Fri Feb 05, 2010 21:18 Post subject: |
|
|
Saarilainen
WinRAR —> Преобразовать архивы |
|
Back to top |
|
|
Saarilainen
Joined: 05 Feb 2010 Posts: 15
|
(Separately) Posted: Sat Feb 06, 2010 12:23 Post subject: |
|
|
MVV
принцип понятен, только как передать батнику на вход каталоги, в которых будет осуществляться поиск? И подскажи ещё как организовать в repacker.bat создание каталога с именем_расширением, распаковку туда содержимого офисного файла, и обратные операции |
|
Back to top |
|
|
Saarilainen
Joined: 05 Feb 2010 Posts: 15
|
(Separately) Posted: Thu Feb 11, 2010 10:42 Post subject: |
|
|
с распаковкой всё замечательно получилось.
enumer.cmd
Code: | @echo off
set enum_types=*.docx;*.xlsx;*.xlsm;*.xlsb;*.pptx
if not -%1==- set enum_types=%1
for /r %%f in (%enum_types%) do call %0\..\repacker.cmd "%%f" |
repacker.cmd
Code: | @echo off
move %1 %1.zip
md %1
7z x %1.zip -o%1 -r
del %1.zip
echo %1 >>lst.txt |
Эти файлы (enumer.cmd; repacker.cmd; lst.txt) буду паковать вместе с целевым каталогом, а после распаковки запускать батник для обратной упаковки офисных файлов (*.docx;*.xlsx;*.xlsm;*.xlsb;*.pptx...)
Но с этим у меня затруднения - помогите оформить алгоритм . Итак:
- берётся из списка lst.txt первый путь;
- этот путь (каталог) становится текущим (к примеру C:\Capture\01\свод 2010.xlsm\);
- вызывается 7zip, который пакует его содержимое в zip-файл "свод 2010.xlsm.zip";
- этот "свод 2010.xlsm.zip копируется или перемещается на 1 уровень вверх;
- каталог свод 2010.xlsm\ удаляется со всем содержимым;
- "свод 2010.xlsm.zip" переименовывается в "свод 2010.xlsm";
- цикл повторяется со следующим элементом списка lst.txt
Может быть как-то проще можно? |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Thu Feb 11, 2010 15:17 Post subject: |
|
|
Перечислитель вроде работает, поэтому говорим о репакере.
- распаковать в папку ~~~%1
- переименовать %1 в %1.~~~
- запаковать содержимое папки ~~~%1 в файл %1
- удалить папку ~~~%1 и файл %1.~~~
В общем,
Code: | @echo off
if -%1==- goto exit
"C:\Program Files\7-Zip\7z.exe" x -o~~tmp~~ %1
if errorlevel 1 goto cleanup
move %1 %1.~~~
cd ~~tmp~~
"C:\Program Files\7-Zip\7z.exe" a -tzip %1 *
cd ..
if not exist %1 move %1.~~~ %1
:cleanup
rd /s /q ~~tmp~~
del %1.~~~
:exit |
В папку входить пришлось для того, чтобы архиватор не добавлял саму папку в архив. Если распаковка или упаковка не удалась, преобразование не выполняется, оригинальный файл сохраняется. Командный файл требует полного пути к архиву, иначе работать не будет, но с перечислителем все должно быть нормально. Папка ~~tmp~~ создается в папке перечислителя. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
|
Saarilainen
Joined: 05 Feb 2010 Posts: 15
|
(Separately) Posted: Thu Feb 11, 2010 16:37 Post subject: |
|
|
Код работает! файлы перепаковываются. Но я б хотел ещё на два этапа разбить - упаковывать 7zip'ом не сразу, а уже после того как все файлы, заданные в маске, распакуются в свои папки. Но проблема как на втором этапе подать скрипту на вход имена папок (может через файл-список, создаваемый на 1м этапе, или как-то по поиску) |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
|
Back to top |
|
|
Saarilainen
Joined: 05 Feb 2010 Posts: 15
|
(Separately) Posted: Thu Feb 11, 2010 17:42 Post subject: |
|
|
смысл в том чтобы раззипованное содержимое в этих папках упаковать более эффективными алгоритмами (по сравнению с ZIP). Это не только офисных файлов касается, но также игровых ресурсов (FarCry например или COD). Можно конечно precomp'ом предварительно обработать, но он ещё сыроват, глючит, да и выигрыш в сжатии не такой заметный как в случае с полной распаковкой |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
(Separately) Posted: Thu Feb 11, 2010 18:54 Post subject: |
|
|
Я думал (читал заголовок, первый пост темы...), что автор хочет переупаковать с более высокой степенью сжатия файлы документов офиса, которые являются ZIP-архивами - здесь другой формат недопустим. Да и вообще везде, где нельзя менять формат архива, такой метод будет неприменим. Но вообще, если есть желание - модифицируй репакер, там у 7-Zip есть ключи -t и -m, задающие формат и параметры сжатия (я прописал там ZIP). _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|
Back to top |
|
|
Saarilainen
Joined: 05 Feb 2010 Posts: 15
|
(Separately) Posted: Thu Feb 11, 2010 20:23 Post subject: |
|
|
да это я наверное недостаточно точно описал ситуацию. В папке с документами лежат не только от 2007-го офиса файлы, но и бинарные от 2003-го, и PDFки, и текстовые csv, xml. И эту папку всю нужно упаковать на флэшку в конце рабочего дня, и чтобы лучше сжалось - предварительно раззиповать 2007е, а когда настанет время обратно их извлечь - тогда уже после распаковки архива с рабочей папкой восстановить офисные(2007)файлы 7zip'ом (при этом их размер будет меньше оригинального, что само по себе тоже замечательно). А поскольку познаний в сценариях не хватает - вот и обратился к экспертам
Ну я ещё поэкспериментирую на досуге, отпишусь потом если получится |
|
Back to top |
|
|
MVV
Joined: 15 Oct 2009 Posts: 4811 Location: Ростов-Дон
|
|
Back to top |
|
|
Saarilainen
Joined: 05 Feb 2010 Posts: 15
|
(Separately) Posted: Tue Feb 16, 2010 20:56 Post subject: |
|
|
выигрыш в сжатии на больших файлах в 2 раза (и это не предел)
Вобщем кумекал, изучал справку по командам и догнал
оказалось до смешного просто
call_pack.cmd
for /f "delims=""" %%f in (lst.txt) do call %0\..\pack.cmd %%f
(файл lst.txt создаётся при запуске 1-го скрипта, см. предыдущие посты)
pack.cmd
cd %1
7z.exe a -tzip %1.zip * -w%1 -mx=9 -mfb=258 -mpass=15
cd ..
rd /s /q %1
move %1.zip %1
спасибо камраду MVV за соучастие |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|