[script request] Распаковка/запаковка офисных файлов
Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik
-
Saarilainen
- Сообщения: 15
- Зарегистрирован: Пт фев 05, 2010 09:11
[script request] Распаковка/запаковка офисных файлов
Для последующей более плотной упаковки файлов 2007-го офиса, которые представляют из себя zip-архивы, нужен скрипт, который ищет эти файлы в выделенных каталогах рекурсивно по заданным расширениям, распаковывает в одноимённые папки с этими же расширениями в названии (через подчеркушку _ ), удаляет после успешной распаковки оригинальные файлы. И второй скрипт - осуществляющий обратные действия: ищет рекурсивно в выделенных каталогах папки с подчеркушками, упаковывает их содержимое в зипы, присваивает зипам имя и расширение из названия исходной папки, после чего удаляет папки с подчеркушками. Во избежание ошибок удобнее наверное заранее задать все возможные расширения в файле-списке (xlsx; xlsm; docx; pptx... ).
А почему просто не добавить их в архив еще раз, если они помещаются в собственный контейнер без сжатия?
Или может можно как-то задать степень сжатия в настройках офиса?
Кстати, думаю, проще было бы написать один скрипт - который проходил бы по директориям и делал оба действия сразу - распаковывал и тут же упаковывал, будет меньше мусора и займет меньше времени.
Или может можно как-то задать степень сжатия в настройках офиса?
Кстати, думаю, проще было бы написать один скрипт - который проходил бы по директориям и делал оба действия сразу - распаковывал и тут же упаковывал, будет меньше мусора и займет меньше времени.
-
Saarilainen
- Сообщения: 15
- Зарегистрирован: Пт фев 05, 2010 09:11
можно действительно написать скрипт для отлова таких файлов и более плотного пережатия 7zip'ом. Ну просто есть более эффективные методы, заточенные под каждый тип - и с точки зрения степени сжатия выгоднее предварительно расжать zip-потоки (разница по размеру примерно в 2 раза). Встречал в сети самописные утилитки, которые разжимают игровые ресурсы COD (которые тоже из себя представляют zip-архивы), но там пути нужно руками прописывать, что не очень удобно. Юзабельность в том чтобы именно в выделенных каталогах поиск осуществлялся.MVV писал(а):проще было бы написать один скрипт - который проходил бы по директориям и делал оба действия сразу - распаковывал и тут же упаковывал
А в настройках офиса степень сжатия не задать, она по умолчанию средняя. Если перепаковать 7zipом или ТС'ом тот же xlsx в zip с максимальными настройками, то офисом он открывается без проблем
Если открывается после пережатия - отлично. Кстати, сам смотрел, у ОпенОфиса в архиве базы данных файлы по умолчанию хранятся без сжатия.
Вообще, задача решается простеньким bat-файликом, можно двумя.
enumer.bat
(можно дописать еще масок для файлов офиса в файл, или передавать как параметр)
repacker.bat
Репакер тестовой версии будет просто писать в консоль путь к файлу. Остается лишь разобрать параметры командной строки архиватора и запустить в репакере распаковку и упаковку обратно содержимого переданного файла. Можно предварительно запускать архиватор для отображения содержимого архива (можно выводить в nul) и проверять код возврата - если файл не является архивом, пропускать его.
Вообще, задача решается простеньким 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
Код: Выделить всё
@echo off
echo %1-
Saarilainen
- Сообщения: 15
- Зарегистрирован: Пт фев 05, 2010 09:11
-
Saarilainen
- Сообщения: 15
- Зарегистрирован: Пт фев 05, 2010 09:11
с распаковкой всё замечательно получилось.
enumer.cmd
repacker.cmd
Эти файлы (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
Может быть как-то проще можно?
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" Код: Выделить всё
@echo off
move %1 %1.zip
md %1
7z x %1.zip -o%1 -r
del %1.zip
echo %1 >>lst.txtНо с этим у меня затруднения - помогите оформить алгоритм . Итак:
- берётся из списка 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
Может быть как-то проще можно?
Перечислитель вроде работает, поэтому говорим о репакере.
- распаковать в папку ~~~%1
- переименовать %1 в %1.~~~
- запаковать содержимое папки ~~~%1 в файл %1
- удалить папку ~~~%1 и файл %1.~~~
В общем,
В папку входить пришлось для того, чтобы архиватор не добавлял саму папку в архив. Если распаковка или упаковка не удалась, преобразование не выполняется, оригинальный файл сохраняется. Командный файл требует полного пути к архиву, иначе работать не будет, но с перечислителем все должно быть нормально. Папка ~~tmp~~ создается в папке перечислителя.
- распаковать в папку ~~~%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-
Saarilainen
- Сообщения: 15
- Зарегистрирован: Пт фев 05, 2010 09:11
Код работает! файлы перепаковываются. Но я б хотел ещё на два этапа разбить - упаковывать 7zip'ом не сразу, а уже после того как все файлы, заданные в маске, распакуются в свои папки. Но проблема как на втором этапе подать скрипту на вход имена папок (может через файл-список, создаваемый на 1м этапе, или как-то по поиску)
-
Saarilainen
- Сообщения: 15
- Зарегистрирован: Пт фев 05, 2010 09:11
смысл в том чтобы раззипованное содержимое в этих папках упаковать более эффективными алгоритмами (по сравнению с ZIP). Это не только офисных файлов касается, но также игровых ресурсов (FarCry например или COD). Можно конечно precomp'ом предварительно обработать, но он ещё сыроват, глючит, да и выигрыш в сжатии не такой заметный как в случае с полной распаковкой
Я думал (читал заголовок, первый пост темы...), что автор хочет переупаковать с более высокой степенью сжатия файлы документов офиса, которые являются ZIP-архивами - здесь другой формат недопустим. Да и вообще везде, где нельзя менять формат архива, такой метод будет неприменим. Но вообще, если есть желание - модифицируй репакер, там у 7-Zip есть ключи -t и -m, задающие формат и параметры сжатия (я прописал там ZIP).
-
Saarilainen
- Сообщения: 15
- Зарегистрирован: Пт фев 05, 2010 09:11
да это я наверное недостаточно точно описал ситуацию. В папке с документами лежат не только от 2007-го офиса файлы, но и бинарные от 2003-го, и PDFки, и текстовые csv, xml. И эту папку всю нужно упаковать на флэшку в конце рабочего дня, и чтобы лучше сжалось - предварительно раззиповать 2007е, а когда настанет время обратно их извлечь - тогда уже после распаковки архива с рабочей папкой восстановить офисные(2007)файлы 7zip'ом (при этом их размер будет меньше оригинального, что само по себе тоже замечательно). А поскольку познаний в сценариях не хватает - вот и обратился к экспертам
Ну я ещё поэкспериментирую на досуге, отпишусь потом если получится
Ну я ещё поэкспериментирую на досуге, отпишусь потом если получится
-
Saarilainen
- Сообщения: 15
- Зарегистрирован: Пт фев 05, 2010 09:11
выигрыш в сжатии на больших файлах в 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 за соучастие

Вобщем кумекал, изучал справку по командам и догнал
оказалось до смешного просто
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 за соучастие