Страница 1 из 1
[script request] Распаковка/запаковка офисных файлов
Добавлено: Пт фев 05, 2010 13:01
Saarilainen
Для последующей более плотной упаковки файлов 2007-го офиса, которые представляют из себя zip-архивы, нужен скрипт, который ищет эти файлы в выделенных каталогах рекурсивно по заданным расширениям, распаковывает в одноимённые папки с этими же расширениями в названии (через подчеркушку _ ), удаляет после успешной распаковки оригинальные файлы. И второй скрипт - осуществляющий обратные действия: ищет рекурсивно в выделенных каталогах папки с подчеркушками, упаковывает их содержимое в зипы, присваивает зипам имя и расширение из названия исходной папки, после чего удаляет папки с подчеркушками. Во избежание ошибок удобнее наверное заранее задать все возможные расширения в файле-списке (xlsx; xlsm; docx; pptx... ).
Добавлено: Пт фев 05, 2010 13:15
MVV
А почему просто не добавить их в архив еще раз, если они помещаются в собственный контейнер без сжатия?
Или может можно как-то задать степень сжатия в настройках офиса?
Кстати, думаю, проще было бы написать один скрипт - который проходил бы по директориям и делал оба действия сразу - распаковывал и тут же упаковывал, будет меньше мусора и займет меньше времени.
Добавлено: Пт фев 05, 2010 14:11
Saarilainen
MVV писал(а):проще было бы написать один скрипт - который проходил бы по директориям и делал оба действия сразу - распаковывал и тут же упаковывал
можно действительно написать скрипт для отлова таких файлов и более плотного пережатия 7zip'ом. Ну просто есть более эффективные методы, заточенные под каждый тип - и с точки зрения степени сжатия выгоднее предварительно расжать zip-потоки (разница по размеру примерно в 2 раза). Встречал в сети самописные утилитки, которые разжимают игровые ресурсы COD (которые тоже из себя представляют zip-архивы), но там пути нужно руками прописывать, что не очень удобно. Юзабельность в том чтобы именно в выделенных каталогах поиск осуществлялся.
А в настройках офиса степень сжатия не задать, она по умолчанию средняя. Если перепаковать 7zipом или ТС'ом тот же xlsx в zip с максимальными настройками, то офисом он открывается без проблем
Добавлено: Пт фев 05, 2010 15:07
MVV
Если открывается после пережатия - отлично. Кстати, сам смотрел, у ОпенОфиса в архиве базы данных файлы по умолчанию хранятся без сжатия.
Вообще, задача решается простеньким bat-файликом, можно двумя.
enumer.bat
Код: Выделить всё
@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) и проверять код возврата - если файл не является архивом, пропускать его.
Добавлено: Пт фев 05, 2010 20:18
Tol!k
Saarilainen
WinRAR —> Преобразовать архивы
Добавлено: Сб фев 06, 2010 11:23
Saarilainen
MVV
принцип понятен, только как передать батнику на вход каталоги, в которых будет осуществляться поиск? И подскажи ещё как организовать в repacker.bat создание каталога с именем_расширением, распаковку туда содержимого офисного файла, и обратные операции
Добавлено: Чт фев 11, 2010 09:42
Saarilainen
с распаковкой всё замечательно получилось.
enumer.cmd
Код: Выделить всё
@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
Код: Выделить всё
@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
Может быть как-то проще можно?
Добавлено: Чт фев 11, 2010 14:17
MVV
Перечислитель вроде работает, поэтому говорим о репакере.
- распаковать в папку ~~~%1
- переименовать %1 в %1.~~~
- запаковать содержимое папки ~~~%1 в файл %1
- удалить папку ~~~%1 и файл %1.~~~
В общем,
Код: Выделить всё
@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~~ создается в папке перечислителя.
Добавлено: Чт фев 11, 2010 15:37
Saarilainen
Код работает! файлы перепаковываются. Но я б хотел ещё на два этапа разбить - упаковывать 7zip'ом не сразу, а уже после того как все файлы, заданные в маске, распакуются в свои папки. Но проблема как на втором этапе подать скрипту на вход имена папок (может через файл-список, создаваемый на 1м этапе, или как-то по поиску)
Добавлено: Чт фев 11, 2010 16:03
MVV
Коронный вопрос: А смысл?
Во-первых, будет больше мусора одновременно лежать. Во-вторых, усложняется скрипт, т.к. придется разбивать репакер на 2 части и вызывать их отдельно. И в-третьих, тебе все равно не нужны эти папки.
Добавлено: Чт фев 11, 2010 16:42
Saarilainen
смысл в том чтобы раззипованное содержимое в этих папках упаковать более эффективными алгоритмами (по сравнению с ZIP). Это не только офисных файлов касается, но также игровых ресурсов (FarCry например или COD). Можно конечно precomp'ом предварительно обработать, но он ещё сыроват, глючит, да и выигрыш в сжатии не такой заметный как в случае с полной распаковкой
Добавлено: Чт фев 11, 2010 17:54
MVV
Я думал (читал заголовок, первый пост темы...), что автор хочет переупаковать с более высокой степенью сжатия файлы документов офиса, которые являются ZIP-архивами - здесь другой формат недопустим. Да и вообще везде, где нельзя менять формат архива, такой метод будет неприменим. Но вообще, если есть желание - модифицируй репакер, там у 7-Zip есть ключи -t и -m, задающие формат и параметры сжатия (я прописал там ZIP).
Добавлено: Чт фев 11, 2010 19:23
Saarilainen
да это я наверное недостаточно точно описал ситуацию. В папке с документами лежат не только от 2007-го офиса файлы, но и бинарные от 2003-го, и PDFки, и текстовые csv, xml. И эту папку всю нужно упаковать на флэшку в конце рабочего дня, и чтобы лучше сжалось - предварительно раззиповать 2007е, а когда настанет время обратно их извлечь - тогда уже после распаковки архива с рабочей папкой восстановить офисные(2007)файлы 7zip'ом (при этом их размер будет меньше оригинального, что само по себе тоже замечательно). А поскольку познаний в сценариях не хватает - вот и обратился к экспертам
Ну я ещё поэкспериментирую на досуге, отпишусь потом если получится
Добавлено: Чт фев 11, 2010 19:47
MVV
Неужели там так много офисных файлов, что такая овчинка стоит выделки?
Посмотри, с какой степенью сжатия упакованы файлы в офисных архивах. Если с нулевой - забей на все и тупо архивируй всю папку прямо с нетронутыми документами - сжатие без сжатия не усложняет работу другим архиваторам.
Добавлено: Вт фев 16, 2010 19:56
Saarilainen
выигрыш в сжатии на больших файлах в 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 за соучастие
