| View previous topic :: View next topic | 
	
	
		| Author | Message | 
	
		| serhiy 
 
 
 Joined: 10 Dec 2005
 Posts: 11
 Location: Tyachiv
 
 | 
			
				|  (Separately) Posted: Fri Mar 13, 2009 23:13    Post subject: Скрипт для распаковки избранных файлов из нескольких архивов |   |  
				| 
 |  
				| Добрый день. Столкнулся с следующей задачей
 
 Много архивных файлов (rar, zip, tgz) и в каждом из них нужно найти и извлечь скажем файл template.jpg (или png) и после извлечения переименовать в такое же название как и название архива. Если в архиве несколько tempate.jpg - переименовать на "название-архива-1.jpg", "название-архива-2.jpg" и тд. (Хорошо б было если вобще в место названия был бы полный внутренний путь к этому файлу).
 Есть ли возможность просканировать все архивы и главное вложеные архивы для получения списка таких файлов.
 
 Сам в скриптах не особо силен, возможно подскажете способы реализации.
 Спасибо большое
 
 P.S. Обращаюсь с такой проблемой поскольку нужно обработать около 4-5 гигов или даже больше архивных файлов.. вручную уже сил нет.
 
 
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| serhiy 
 
 
 Joined: 10 Dec 2005
 Posts: 11
 Location: Tyachiv
 
 | 
			
				|  (Separately) Posted: Sat Mar 14, 2009 19:54    Post subject: |   |  
				| 
 |  
				| Пока дошел до следующего варианта : 
 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 |  | 
	
		|  | 
	
		| Tol!k 
 
  
 Joined: 01 Apr 2008
 Posts: 1727
 Location: Арзамас
 
 | 
			
				|  (Separately) Posted: Sat Mar 14, 2009 20:35    Post subject: |   |  
				| 
 |  
				|  	  | serhiy wrote: |  	  | 3. Выделяю архивы в обоих тоталах В одном из них запускаю скрипт - по его окончанию из другого тотала удаляю все выделеные архивы (ибо они уже распакованы)
 | 
 фоновая распаковка архивов с последующим удалением архивов
 
 Last edited by Tol!k on Sat Mar 14, 2009 22:35; edited 1 time in total
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| serhiy 
 
 
 Joined: 10 Dec 2005
 Posts: 11
 Location: Tyachiv
 
 | 
			
				|  (Separately) Posted: Sat Mar 14, 2009 22:20    Post subject: |   |  
				| 
 |  
				| Сделал так 
 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 |  | 
	
		|  | 
	
		| Tol!k 
 
  
 Joined: 01 Apr 2008
 Posts: 1727
 Location: Арзамас
 
 | 
			
				|  (Separately) Posted: Sat Mar 14, 2009 22:34    Post subject: |   |  
				| 
 |  
				| Да, есть такое дело. Попробуй скрипт от Batya 	  | serhiy wrote: |  	  | Выкинуло ошибку : Прервано пользователем. -
 | 
 Добавлено:
 Не успевают распаковаться все архивы.
 
 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 |  | 
	
		|  | 
	
		| serhiy 
 
 
 Joined: 10 Dec 2005
 Posts: 11
 Location: Tyachiv
 
 | 
			
				|  (Separately) Posted: Sun Mar 15, 2009 06:04    Post subject: |   |  
				| 
 |  
				| Уже немного проще! Спасибо.. Работает правда не до конца так как нужно, но чувствую момент истины где то близко
   
 Проблема в том что этот template* зарыт еще во вложеных архивах внутри текущего, поэтому приходится после первой распаковки искать опять архивы, потом еще раз и еще раз.. пока в папке не останется ни одного архива и только после этого уже искать все распакованные template*.png - после чего соотвественно их и переименовывать.
 Итого вся вышеописанная операция на двухядерной машине - имея скажем в папке 200 архивов - занимает часа 2-3 - тотал периодически подвисает для отображения всех zip,rar и тд через ctrl+B
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| serhiy 
 
 
 Joined: 10 Dec 2005
 Posts: 11
 Location: Tyachiv
 
 | 
			
				|  (Separately) Posted: Sun Mar 15, 2009 06:22    Post subject: |   |  
				| 
 |  
				|  	  | Tol!k wrote: |  	  | 'Время на распаковку всех выделенных архивов
 TCS.Pause=7000
 
 | 
 
 Еще плохо что время не умеет динамически меняться (если скажем 80 архивов TCS.Pause=70000 а если 10 то 3000)
 Хорошо б было если после каждой распаковки распакованный архив удалялся, т.е распаковал - удалился, распаковал - удалился итд или даже не знаю как бы его эдак...
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| Tol!k 
 
  
 Joined: 01 Apr 2008
 Posts: 1727
 Location: Арзамас
 
 | 
			
				|  (Separately) Posted: Sun Mar 15, 2009 12:56    Post subject: |   |  
				| 
 |  
				| Значит нужно извлекать не только template*, но и вложенные архивы: 	  | serhiy wrote: |  	  | Проблема в том что этот template* зарыт еще во вложеных архивах внутри текущего, поэтому приходится после первой распаковки искать опять архивы, потом еще раз и еще раз.. пока в папке не останется ни одного архива и только после этого уже искать все распакованные template*.png | 
 'Маска для распаковки
 TCS.SendKeystroke "template* *.rar *.zip *.tgz"
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| Tol!k 
 
  
 Joined: 01 Apr 2008
 Posts: 1727
 Location: Арзамас
 
 | 
			
				|  (Separately) Posted: Sun Mar 15, 2009 13:27    Post subject: |   |  
				| 
 |  
				| Написать батник и повесить его на кнопку с параметром %L 	  | serhiy wrote: |  	  | Хорошо б было если после каждой распаковки распакованный архив удалялся, т.е распаковал - удалился, распаковал - удалился итд или даже не знаю как бы его эдак... | 
 Заготовка:
 
  	  | Code: |  	  | chcp 1251 > nul
 setlocal enableextensions
 for /F "delims=" %%a in (%1) do (
 start /wait архиватор.exe распаковать "%%a" -параметры
 del /Q "%%a"
 )
 | 
 Так даже быстрее — ждать придётся ровно столько, сколько нужно для распаковки
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| serhiy 
 
 
 Joined: 10 Dec 2005
 Posts: 11
 Location: Tyachiv
 
 | 
			
				|  (Separately) Posted: Sun Mar 15, 2009 14:36    Post subject: |   |  
				| 
 |  
				|  	  | 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 |  | 
	
		|  | 
	
		| Tol!k 
 
  
 Joined: 01 Apr 2008
 Posts: 1727
 Location: Арзамас
 
 | 
			
				|  (Separately) Posted: Sun Mar 15, 2009 16:02    Post subject: |   |  
				| 
 |  
				| Никаких переносов здесь быть не должно, это одна команда. Про параметры написано в справках соответствующих программ. %L и %P — это параметры Тотала, в батнике они могут оказаться только в виде %1 и %2. 	  | Quote: |  	  | start /wait C:\Program Files\WinRAR\WinRar.exe
 "%%a"
 
 X -ibck -ad <<%L>> "%P" (Эта строка параметров??)
 | 
 
 ---------------------------------------------- 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" у меня не работает
   
 Содержимое 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 |  | 
	
		|  | 
	
		| serhiy 
 
 
 Joined: 10 Dec 2005
 Posts: 11
 Location: Tyachiv
 
 | 
			
				|  (Separately) Posted: Sun Mar 15, 2009 18:21    Post subject: |   |  
				| 
 |  
				| Все супер!!! Премного благодарен... работает так как нужно!!! Можно ли еще добавить одну функцию.. - если нет файлов для извлечения - чтоб это диагностическое сообщение закрывалось автоматом.. хотя это уже мелочи - главное все заработало!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Счастью нет границ!
        |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| Tol!k 
 
  
 Joined: 01 Apr 2008
 Posts: 1727
 Location: Арзамас
 
 | 
			
				|  (Separately) Posted: Sun Mar 15, 2009 18:43    Post subject: |   |  
				| 
 |  
				|  	  | serhiy wrote: |  	  | Можно ли еще добавить одну функцию.. - если нет файлов для извлечения - чтоб это диагностическое сообщение закрывалось автоматом.. | 
 
  	  | Справка WinRar wrote: |  	  | Ключ -Y — подразумевать ответ "Да" на все запросы --------------------------------------------------------------------------------
 Если указан этот ключ, то на все запросы будет автоматически даваться ответ "Да".
 | 
 start /wait C:\Progra~1\WinRAR\WinRar.exe X -y "%%a" @template.lst "%%~dpna\"
 Но пустые папки создаются
  |  | 
	
		| Back to top |  | 
	
		|  | 
	
		| serhiy 
 
 
 Joined: 10 Dec 2005
 Posts: 11
 Location: Tyachiv
 
 | 
			
				|  (Separately) Posted: Sun Mar 15, 2009 20:05    Post subject: |   |  
				| 
 |  
				| Добавил еще ключик 
 -ibck - запустить WinRAR как фоновый процесс в системном лотке (ключ);
 
 Получилось
 start /wait C:\Progra~1\WinRAR\WinRar.exe X -y -ibck "%%a" @template.lst "%%~dpna\"
 
 Лепота !
 |  | 
	
		| Back to top |  | 
	
		|  | 
	
		|  |