Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

[script request] Распаковка/запаковка офисных файлов

 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Saarilainen



Joined: 05 Feb 2010
Posts: 15

Post (Separately) Posted: Fri Feb 05, 2010 14:01    Post subject: [script request] Распаковка/запаковка офисных файлов Reply with quote

Для последующей более плотной упаковки файлов 2007-го офиса, которые представляют из себя zip-архивы, нужен скрипт, который ищет эти файлы в выделенных каталогах рекурсивно по заданным расширениям, распаковывает в одноимённые папки с этими же расширениями в названии (через подчеркушку _ ), удаляет после успешной распаковки оригинальные файлы. И второй скрипт - осуществляющий обратные действия: ищет рекурсивно в выделенных каталогах папки с подчеркушками, упаковывает их содержимое в зипы, присваивает зипам имя и расширение из названия исходной папки, после чего удаляет папки с подчеркушками. Во избежание ошибок удобнее наверное заранее задать все возможные расширения в файле-списке (xlsx; xlsm; docx; pptx... ).
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Fri Feb 05, 2010 14:15    Post subject: Reply with quote

А почему просто не добавить их в архив еще раз, если они помещаются в собственный контейнер без сжатия?
Или может можно как-то задать степень сжатия в настройках офиса?

Кстати, думаю, проще было бы написать один скрипт - который проходил бы по директориям и делал оба действия сразу - распаковывал и тут же упаковывал, будет меньше мусора и займет меньше времени.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
Saarilainen



Joined: 05 Feb 2010
Posts: 15

Post (Separately) Posted: Fri Feb 05, 2010 15:11    Post subject: Reply with quote

MVV wrote:
проще было бы написать один скрипт - который проходил бы по директориям и делал оба действия сразу - распаковывал и тут же упаковывал

можно действительно написать скрипт для отлова таких файлов и более плотного пережатия 7zip'ом. Ну просто есть более эффективные методы, заточенные под каждый тип - и с точки зрения степени сжатия выгоднее предварительно расжать zip-потоки (разница по размеру примерно в 2 раза). Встречал в сети самописные утилитки, которые разжимают игровые ресурсы COD (которые тоже из себя представляют zip-архивы), но там пути нужно руками прописывать, что не очень удобно. Юзабельность в том чтобы именно в выделенных каталогах поиск осуществлялся.
А в настройках офиса степень сжатия не задать, она по умолчанию средняя. Если перепаковать 7zipом или ТС'ом тот же xlsx в zip с максимальными настройками, то офисом он открывается без проблем
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Fri Feb 05, 2010 16:07    Post subject: Reply with quote

Если открывается после пережатия - отлично. Кстати, сам смотрел, у ОпенОфиса в архиве базы данных файлы по умолчанию хранятся без сжатия.

Вообще, задача решается простеньким 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
Code:
@echo off
echo %1

Репакер тестовой версии будет просто писать в консоль путь к файлу. Остается лишь разобрать параметры командной строки архиватора и запустить в репакере распаковку и упаковку обратно содержимого переданного файла. Можно предварительно запускать архиватор для отображения содержимого архива (можно выводить в nul) и проверять код возврата - если файл не является архивом, пропускать его.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
Tol!k



Joined: 01 Apr 2008
Posts: 1727
Location: Арзамас

Post (Separately) Posted: Fri Feb 05, 2010 21:18    Post subject: Reply with quote

Saarilainen
WinRAR —> Преобразовать архивы
Back to top
View user's profile Send private message
Saarilainen



Joined: 05 Feb 2010
Posts: 15

Post (Separately) Posted: Sat Feb 06, 2010 12:23    Post subject: Reply with quote

MVV
принцип понятен, только как передать батнику на вход каталоги, в которых будет осуществляться поиск? И подскажи ещё как организовать в repacker.bat создание каталога с именем_расширением, распаковку туда содержимого офисного файла, и обратные операции
Back to top
View user's profile Send private message
Saarilainen



Joined: 05 Feb 2010
Posts: 15

Post (Separately) Posted: Thu Feb 11, 2010 10:42    Post subject: Reply with quote

с распаковкой всё замечательно получилось.
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
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Thu Feb 11, 2010 15:17    Post subject: Reply with quote

Перечислитель вроде работает, поэтому говорим о репакере.
- распаковать в папку ~~~%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
View user's profile Send private message
Saarilainen



Joined: 05 Feb 2010
Posts: 15

Post (Separately) Posted: Thu Feb 11, 2010 16:37    Post subject: Reply with quote

Код работает! файлы перепаковываются. Но я б хотел ещё на два этапа разбить - упаковывать 7zip'ом не сразу, а уже после того как все файлы, заданные в маске, распакуются в свои папки. Но проблема как на втором этапе подать скрипту на вход имена папок (может через файл-список, создаваемый на 1м этапе, или как-то по поиску)
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Thu Feb 11, 2010 17:03    Post subject: Reply with quote

Коронный вопрос: А смысл?

Во-первых, будет больше мусора одновременно лежать. Во-вторых, усложняется скрипт, т.к. придется разбивать репакер на 2 части и вызывать их отдельно. И в-третьих, тебе все равно не нужны эти папки.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
Saarilainen



Joined: 05 Feb 2010
Posts: 15

Post (Separately) Posted: Thu Feb 11, 2010 17:42    Post subject: Reply with quote

смысл в том чтобы раззипованное содержимое в этих папках упаковать более эффективными алгоритмами (по сравнению с ZIP). Это не только офисных файлов касается, но также игровых ресурсов (FarCry например или COD). Можно конечно precomp'ом предварительно обработать, но он ещё сыроват, глючит, да и выигрыш в сжатии не такой заметный как в случае с полной распаковкой
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Thu Feb 11, 2010 18:54    Post subject: Reply with quote

Я думал (читал заголовок, первый пост темы...), что автор хочет переупаковать с более высокой степенью сжатия файлы документов офиса, которые являются ZIP-архивами - здесь другой формат недопустим. Да и вообще везде, где нельзя менять формат архива, такой метод будет неприменим. Но вообще, если есть желание - модифицируй репакер, там у 7-Zip есть ключи -t и -m, задающие формат и параметры сжатия (я прописал там ZIP).
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
Saarilainen



Joined: 05 Feb 2010
Posts: 15

Post (Separately) Posted: Thu Feb 11, 2010 20:23    Post subject: Reply with quote

да это я наверное недостаточно точно описал ситуацию. В папке с документами лежат не только от 2007-го офиса файлы, но и бинарные от 2003-го, и PDFки, и текстовые csv, xml. И эту папку всю нужно упаковать на флэшку в конце рабочего дня, и чтобы лучше сжалось - предварительно раззиповать 2007е, а когда настанет время обратно их извлечь - тогда уже после распаковки архива с рабочей папкой восстановить офисные(2007)файлы 7zip'ом (при этом их размер будет меньше оригинального, что само по себе тоже замечательно). А поскольку познаний в сценариях не хватает - вот и обратился к экспертам Smile
Ну я ещё поэкспериментирую на досуге, отпишусь потом если получится
Back to top
View user's profile Send private message
MVV



Joined: 15 Oct 2009
Posts: 4811
Location: Ростов-Дон

Post (Separately) Posted: Thu Feb 11, 2010 20:47    Post subject: Reply with quote

Неужели там так много офисных файлов, что такая овчинка стоит выделки?

Посмотри, с какой степенью сжатия упакованы файлы в офисных архивах. Если с нулевой - забей на все и тупо архивируй всю папку прямо с нетронутыми документами - сжатие без сжатия не усложняет работу другим архиваторам.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
Back to top
View user's profile Send private message
Saarilainen



Joined: 05 Feb 2010
Posts: 15

Post (Separately) Posted: Tue Feb 16, 2010 20:56    Post subject: Reply with quote

выигрыш в сжатии на больших файлах в 2 раза (и это не предел)
Вобщем кумекал, изучал справку по командам и догнал Very Happy
оказалось до смешного просто

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 за соучастие Wink Exclamation
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
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