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 

Скрипт для распаковки избранных файлов из нескольких архивов

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



Joined: 10 Dec 2005
Posts: 11
Location: Tyachiv

Post (Separately) Posted: Fri Mar 13, 2009 23:13    Post subject: Скрипт для распаковки избранных файлов из нескольких архивов Reply with quote

Добрый день.
Столкнулся с следующей задачей

Много архивных файлов (rar, zip, tgz) и в каждом из них нужно найти и извлечь скажем файл template.jpg (или png) и после извлечения переименовать в такое же название как и название архива. Если в архиве несколько tempate.jpg - переименовать на "название-архива-1.jpg", "название-архива-2.jpg" и тд. (Хорошо б было если вобще в место названия был бы полный внутренний путь к этому файлу).
Есть ли возможность просканировать все архивы и главное вложеные архивы для получения списка таких файлов.

Сам в скриптах не особо силен, возможно подскажете способы реализации.
Спасибо большое

P.S. Обращаюсь с такой проблемой поскольку нужно обработать около 4-5 гигов или даже больше архивных файлов.. вручную уже сил нет.

 !  CaptainFlint:
Нарушение п. 9 правил. Сообщение выделено в отдельную ветку из темы Как распаковать архив в папку с именем и расширением архива?.
Back to top
View user's profile Send private message
serhiy



Joined: 10 Dec 2005
Posts: 11
Location: Tyachiv

Post (Separately) Posted: Sat Mar 14, 2009 19:54    Post subject: Reply with quote

Пока дошел до следующего варианта :

1. Добавил в тотал скрипт

' File: UnpackHere.vbs
' Description: Распаковывает выделенные архивы в ту же директорию
' где расположены сами архивы, причем каждый архив в
' отдельную папку с именем, как у файла архива
' Requirements: WSH Helper for TC by Volniy
' Installation: Создайте для скрипта, например, кнопку на панели TC

' Copyright: (c) 2005, Volniy

Option Explicit
Dim TCS
Set TCS=CreateObject("TCSCRIPT.Helper")
TCS.Pause=100
TCS.SendCommand "cm_UnpackFiles", False
TCS.SendKeystroke "{DELETE}"
TCS.SendKeystroke "{TAB 4}"
TCS.SendKeystroke chr(32)
TCS.SendKeystroke "{ENTER}"
Set TCS = Nothing
WScript.Quit


2. Открываю 2 тотала - в обоих нажимаю ctrl+B и ставлю фильтрацию по rar, zip, tar, gz

3. Выделяю архивы в обоих тоталах
В одном из них запускаю скрипт - по его окончанию из другого тотала удаляю все выделеные архивы (ибо они уже распакованы)

4. Повторяю действия 2-3 до тех пор пока по ctrl+B не останется ни одного архива.

5. Опять ctrl+B - ищу все файлы template.png - выделяю

6. Переименовываю при помощи тотала - групповое переименование + [=tc.Путь]

7. Опять ctrl+B все переименованые файлы копирую в отдельную папку - все остальное можно удалить.. до поры до времени не понадобится.

Долго однако.
Просьба помочь упростить хотя б такой вариант
Back to top
View user's profile Send private message
Tol!k



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

Post (Separately) Posted: Sat Mar 14, 2009 20:35    Post subject: Reply with quote

serhiy wrote:
3. Выделяю архивы в обоих тоталах
В одном из них запускаю скрипт - по его окончанию из другого тотала удаляю все выделеные архивы (ибо они уже распакованы)

фоновая распаковка архивов с последующим удалением архивов


Last edited by Tol!k on Sat Mar 14, 2009 22:35; edited 1 time in total
Back to top
View user's profile Send private message
serhiy



Joined: 10 Dec 2005
Posts: 11
Location: Tyachiv

Post (Separately) Posted: Sat Mar 14, 2009 22:20    Post subject: Reply with quote

Сделал так

Option Explicit
Dim TCS
Set TCS=CreateObject("TCSCRIPT.Helper")
TCS.Pause=100
TCS.SendCommand "cm_SaveSelection", False
TCS.SendCommand "cm_UnpackFiles", False
TCS.SendKeystroke "{DELETE}"
TCS.SendKeystroke "{TAB 4}"
TCS.SendKeystroke chr(32)
TCS.SendKeystroke "{ENTER}"
TCS.SendCommand "cm_RestoreSelection", False
TCS.SendKeystroke "{DELETE}"
TCS.SendKeystroke "{ENTER}"
Set TCS = Nothing
WScript.Quit


Выкинуло ошибку :

Прервано пользователем. -

Чёт не работает - как исправить?
Back to top
View user's profile Send private message
Tol!k



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

Post (Separately) Posted: Sat Mar 14, 2009 22:34    Post subject: Reply with quote

serhiy wrote:
Выкинуло ошибку :
Прервано пользователем. -
Да, есть такое дело. Попробуй скрипт от Batya
Добавлено:
Не успевают распаковаться все архивы.

Option Explicit
Dim TCS
Set TCS=CreateObject("TCSCRIPT.Helper")
TCS.Pause=100
TCS.SendCommand "cm_SaveSelection", False
TCS.SendCommand "cm_UnpackFiles", False
TCS.SendKeystroke "{DELETE}"
TCS.SendKeystroke "{TAB 4}"
TCS.SendKeystroke chr(32)
TCS.SendKeystroke "{ENTER}"
'Время на распаковку всех выделенных архивов
TCS.Pause=7000

TCS.SendCommand "cm_RestoreSelection", False
TCS.Pause=100
TCS.SendKeystroke "+{DELETE}"
TCS.SendKeystroke "{ENTER}"
Set TCS = Nothing
WScript.Quit


а конкретно в твоём случае

Option Explicit
Dim TCS
Set TCS=CreateObject("TCSCRIPT.Helper")
TCS.Pause=100
TCS.SendCommand "cm_SaveSelection", False
TCS.SendCommand "cm_UnpackFiles", False
TCS.SendKeystroke "{DELETE}"
TCS.SendKeystroke "{TAB}"
'Маска для распаковки
TCS.SendKeystroke "template.*"
TCS.SendKeystroke "{TAB 3}"

TCS.SendKeystroke chr(32)
TCS.SendKeystroke "{ENTER}"
'Время на распаковку всех выделенных архивов
TCS.Pause=7000

TCS.SendCommand "cm_RestoreSelection", False
TCS.Pause=100
TCS.SendKeystroke "+{DELETE}"
TCS.SendKeystroke "{ENTER}"
Set TCS = Nothing
WScript.Quit


чтобы извлеклись только template.*
Back to top
View user's profile Send private message
serhiy



Joined: 10 Dec 2005
Posts: 11
Location: Tyachiv

Post (Separately) Posted: Sun Mar 15, 2009 06:04    Post subject: Reply with quote

Уже немного проще! Спасибо..
Работает правда не до конца так как нужно, но чувствую момент истины где то близко Smile

Проблема в том что этот template* зарыт еще во вложеных архивах внутри текущего, поэтому приходится после первой распаковки искать опять архивы, потом еще раз и еще раз.. пока в папке не останется ни одного архива и только после этого уже искать все распакованные template*.png - после чего соотвественно их и переименовывать.
Итого вся вышеописанная операция на двухядерной машине - имея скажем в папке 200 архивов - занимает часа 2-3 - тотал периодически подвисает для отображения всех zip,rar и тд через ctrl+B
Back to top
View user's profile Send private message
serhiy



Joined: 10 Dec 2005
Posts: 11
Location: Tyachiv

Post (Separately) Posted: Sun Mar 15, 2009 06:22    Post subject: Reply with quote

Tol!k wrote:

'Время на распаковку всех выделенных архивов
TCS.Pause=7000



Еще плохо что время не умеет динамически меняться (если скажем 80 архивов TCS.Pause=70000 а если 10 то 3000)
Хорошо б было если после каждой распаковки распакованный архив удалялся, т.е распаковал - удалился, распаковал - удалился итд или даже не знаю как бы его эдак...
Back to top
View user's profile Send private message
Tol!k



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

Post (Separately) Posted: Sun Mar 15, 2009 12:56    Post subject: Reply with quote

serhiy wrote:
Проблема в том что этот template* зарыт еще во вложеных архивах внутри текущего, поэтому приходится после первой распаковки искать опять архивы, потом еще раз и еще раз.. пока в папке не останется ни одного архива и только после этого уже искать все распакованные template*.png
Значит нужно извлекать не только template*, но и вложенные архивы:
'Маска для распаковки
TCS.SendKeystroke "template* *.rar *.zip *.tgz"
Back to top
View user's profile Send private message
Tol!k



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

Post (Separately) Posted: Sun Mar 15, 2009 13:27    Post subject: Reply with quote

serhiy wrote:
Хорошо б было если после каждой распаковки распакованный архив удалялся, т.е распаковал - удалился, распаковал - удалился итд или даже не знаю как бы его эдак...
Написать батник и повесить его на кнопку с параметром %L
Заготовка:
Code:
chcp 1251 > nul

setlocal enableextensions
for /F "delims=" %%a in (%1) do (
start /wait архиватор.exe распаковать "%%a" -параметры
del /Q "%%a"
)

Так даже быстрее — ждать придётся ровно столько, сколько нужно для распаковки
Back to top
View user's profile Send private message
serhiy



Joined: 10 Dec 2005
Posts: 11
Location: Tyachiv

Post (Separately) Posted: Sun Mar 15, 2009 14:36    Post subject: Reply with quote

Tol!k wrote:
Значит нужно извлекать не только template*, но и вложенные архивы:
'Маска для распаковки
TCS.SendKeystroke "template* *.rar *.zip *.tgz"


Приблизительно сработало:
Выделяю - распаковываю
Ctrl+B
Опять выделяю - распаковываю итд
Ну в результате вижу все template.png - супер!

Единственно что со временем неудобно..
Если можно чуть поподробнее насчет батника.
Попробовал - чего то не совсем получилось.

Чисто интуитивно -

chcp 1251 > nul

setlocal enableextensions
for /F "delims=" %%a in (%1) do (
start /wait
C:\Program Files\WinRAR\WinRar.exe
"%%a"

X -ibck -ad <<%L>> "%P" (Эта строка параметров??)

del /Q "%%a"
)
Back to top
View user's profile Send private message
Tol!k



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

Post (Separately) Posted: Sun Mar 15, 2009 16:02    Post subject: Reply with quote

Quote:
start /wait
C:\Program Files\WinRAR\WinRar.exe
"%%a"

X -ibck -ad <<%L>> "%P" (Эта строка параметров??)
Никаких переносов здесь быть не должно, это одна команда. Про параметры написано в справках соответствующих программ. %L и %P — это параметры Тотала, в батнике они могут оказаться только в виде %1 и %2.

---------------------------------------------- template.cmd ----------------------------------------------
@echo off&chcp 1251>nul
setlocal enableextensions
for /F "delims=" %%a in (%1) do (
start /wait C:\Progra~1\WinRAR\WinRar.exe X -y -ibck "%%a" @Диск:\путь\template.lst "%%~dpna\"&&del /Q "%%a"
)

---------------------------------------------- template.cmd ----------------------------------------------

WinRar.exe с коротким путём, т.к. start /wait "C:\Program Files\WinRAR\WinRar.exe" у меня не работает Confused

Содержимое template.lst:
template*
*.rar
*.zip
*.tgz


Last edited by Tol!k on Sun Jun 28, 2009 17:57; edited 1 time in total
Back to top
View user's profile Send private message
serhiy



Joined: 10 Dec 2005
Posts: 11
Location: Tyachiv

Post (Separately) Posted: Sun Mar 15, 2009 18:21    Post subject: Reply with quote

Все супер!!! Премного благодарен... работает так как нужно!!!
Можно ли еще добавить одну функцию.. - если нет файлов для извлечения - чтоб это диагностическое сообщение закрывалось автоматом.. хотя это уже мелочи - главное все заработало!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Счастью нет границ! Very Happy Very Happy Very Happy Very Happy
Back to top
View user's profile Send private message
Tol!k



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

Post (Separately) Posted: Sun Mar 15, 2009 18:43    Post subject: Reply with quote

serhiy wrote:
Можно ли еще добавить одну функцию.. - если нет файлов для извлечения - чтоб это диагностическое сообщение закрывалось автоматом..

Справка WinRar wrote:
Ключ -Y — подразумевать ответ "Да" на все запросы
--------------------------------------------------------------------------------
Если указан этот ключ, то на все запросы будет автоматически даваться ответ "Да".

start /wait C:\Progra~1\WinRAR\WinRar.exe X -y "%%a" @template.lst "%%~dpna\"
Но пустые папки создаются Rolling Eyes
Back to top
View user's profile Send private message
serhiy



Joined: 10 Dec 2005
Posts: 11
Location: Tyachiv

Post (Separately) Posted: Sun Mar 15, 2009 20:05    Post subject: Reply with quote

Добавил еще ключик

-ibck - запустить WinRAR как фоновый процесс в системном лотке (ключ);

Получилось
start /wait C:\Progra~1\WinRAR\WinRar.exe X -y -ibck "%%a" @template.lst "%%~dpna\"

Лепота !
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