Страница 1 из 5

Пакетное архивирование

Добавлено: Чт апр 27, 2006 03:25
Старый Ворчун
Подскажите как настроить пакетное архивирование в TC для автоматизированного пополнения архива, если папки для архивирования постоянно пополняются?
То есть есть, скажем, 5 больших папок, в каждой из них по нескольку десятков подпапок, названия и число этих подпапок - величина переменная. Требуется автоматическое создание архивов для каждой из этих подпапок...
В ручном режиме в тотале это можно проделать с помощью опции "Отдельные архивы для каждого выбранного...", а вот как это можно автоматизировать - я никак не соабражу :(

И попутно - второй вопрос: как подключить опцию "Отдельные архивы для каждого выбранного...", чтобы она была включена автоматически при вызове функции архивирования?

[mod="Avada"]В связи с подъёмом старой темы она переносится в "Автоматизацию".[/mod]

Добавлено: Чт апр 27, 2006 10:59
Batya
Старый Ворчун
По первому вопросу...
Я не понял слов по поводу "автоматизированного пополнения архива". Ты хочешь для каждой подпапки создавать отдельный архив? Если - да, то о каком пополнении идет речь?
И что делать, если архив для подпапки уже существует? Заменять его новым или не архивировать, если архив уже есть?

По второму вопросу...
Никак.
Совет - нужно исправить lng-файл коммандера таким образом, чтобы назначить удобную горячую клавишу Alt+{символ} для нужного чекбокса. В данном случае для строки '5492="..."' убери амперсанд (&) внутри строки и добавь его в начало строки с символом какой-нибудь цифры, например - '5492="&6 ..."'. Т.о., когда нажимаешь Alt+F5 для архивирования, не отпуская Alt жми цифру 6, и будет тебе счастье :)

Добавлено: Чт апр 27, 2006 19:53
Старый Ворчун
Непонятно? Попробую пояснить:
есть ряд папок, которые существуют постоянно, в каждой из них по нескольку сотен подпапок, которые и нужно архивировать. У этих подпапок могут меняться названия, меняется их содержание.
Требуется создание архива для каждой из этих подпапок, но так как заранее неизвестно сколько и какие папки будут помещены в архив, то написать как скрипт для пакетного архивирования я не знаю... :cry:
Вся проблема в том, что нельзя поместить в архив всю большую папку целиком, так как размер каждого архивного файла (папка вместе со всеми вложенными подпапками) будет в лучшем случае несколько сотен Мб, а в некоторых случаях - перевалит за Гб! С такими архивами крайне сложно работать, да и переносить их, скажем, на DVD или CD крайне неудобно - бывает надо резать и т.д. Вот и требуется, чтобы автоматически периодически создавались архивы для каждой подпапки...
Если данный архив уже существует, его можно пополнить, если нет - создать заново... В принципе, даже можно каждый раз перезаписывать архивы.

Например, в программе PowerArchiver 9.61.03 есть такая опция - пакетное архивирование, но папки для архивирования надо указывать вручную каждый раз...
Такой скрипт я пробовал писать в WinRarе, но он иногда глючит - некоторые архивы потом не читаются...

Я понятно объяснил? :lol:

Добавлено: Пт апр 28, 2006 11:01
Batya

Код: Выделить всё

'==========================================================================
' Создание отдельных архивов для каждой вложенной папки в выделенных папках

' В параметрах вызова из TC должно быть прописано:
' %L
'==========================================================================

Dim FSO, WS, FoldList, Fold, Fold1, WinRar, Command, Command1, Command2, ArchKeys, FullArchName
Set FSO      = CreateObject("Scripting.FileSystemObject")
Set WS       = CreateObject("WScript.Shell")
Set FoldList = FSO.OpenTextFile(WScript.Arguments(0), 1)

WinRar   = "D:\Program Files\WinRAR\WinRAR.exe"  ' Путь к WinRAR.exe
Command1 = " A"                                  ' "Добавить файлы в архив"
Command2 = " U"                                  ' "Обновить файлы в архиве"
ArchKeys = " -r -ep1 -ibck"                      ' Ключи:
                                                 '   "Рекурсивно с вложенными папками"
                                                 '   "Исключить из пути базовую папку"
                                                 '   "Запустить WinRAR как фоновый процесс в системном лотке"
Do While Not FoldList.AtEndOfStream
  FoldPath = FoldList.ReadLine
  Set Fold = FSO.GetFolder(FoldPath)
  For Each Fold1 in Fold.SubFolders
    FullArchName = FoldPath & Fold1.Name & ".rar"
    If Not FSO.FileExists(FullArchName) Then
      Command = Command1
    Else
      Command = Command2
    End If
    WS.run """" & WinRar & """" & Command & ArchKeys & " """ & FullArchName & """ """ & Fold1.Path & "\""", , True
  Next
Loop

Set FSO      = Nothing
Set WS       = Nothing
Set Fold     = Nothing
Set Fold1    = Nothing
Set FoldList = Nothing
WScript.Quit
Сохрани код в файл *.vbs. Повесь этот файл на кнопку. В параметрах кнопки напиши %L. Скрипт архивирует WinRar-ом, поэтому в скрипте поправь путь к WinRar на свой.
Скрипт работает по отмеченным "большим" папкам (всё ж таки этот форум про TC, поэтому в TC надо что-то делать ;) ).
Если что-то работает не совсем так, как ты хочешь, пиши - поправлю скрипт.

Добавлено: Пт апр 28, 2006 15:50
Старый Ворчун
Спасибо оромнейшее!
Буду разбираться и пробовать!..

Добавлено: Вт июн 28, 2011 20:21
shveicar
Здравствуйте Batya - а можно изменить скрипт так, чтобы он был бы, с такими параметрами (желательно изменяемыми)
например:
  • 1 выбор типа архива( rar, zip, ну если возможно sfx)
    2 выбор степени сжатия
    3 добавление 5% на восстановление
    4 возможность создания пароля(естественно одинакового, для всех упакованных за один раз архивов)
    5 возможность выбора имени(полное имя файла или полное имя файла с датой- год, месяц, день на конце)
    6 ну и возможность выбора директории создания - текущая панель, противоположная панель.
То есть, алгоритм действий- выделяем группу файлов, нажимаем кнопку(с настраиваемыми параметрами) и получаем группу архивов - в нужной директории с полными именами файлов плюс если возможно с датой на конце(по выбору). Заранее благодарен.

Добавлено: Вс июл 24, 2011 16:01
shveicar
Добрый День. С предыдущей просьбой, как я понял, все слишком сложно. Но подскажите хотя-бы, что изменить в приведенном скрипте , чтобы он архивировал не вложенные папки в выделенных каталогах, а файлы(в данном случае видео с расширениями .wmv, mov, mp4, avi ну если есть возможность изменять параметры- расширения, архивируемых файлов будет просто здорово), вложенные в выделенные каталоги. Спасибо.

Добавлено: Чт авг 04, 2011 13:55
Flasher
shveicar, пляши!

Код: Выделить всё

'••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
' Упаковать каждый файл или содержимое каждой папки в отдельный архив

' Параметры (! - обязательный): 
'  1. <путь к списку элементов> (!)
'  2. "<путь назначения>\" (!)
'  3. <расширение архива> (!)
'  4. <фильтр-список расширений файлов в корнях выделенных папок> 
'     разделитель - запятая (если задействован 5., то - !)
'  5. <параметры упаковки>

' Примеры:
'  1) %WL "%T" zip
'  2) %WL "%T" RAR
'  3) %WL "%P" exe "" -sfx7zCon.sfx
'  4) %WL "%P" rar "" -m5 -s -rr5p -pPASSWORD -ag_DD.MM.YY
'  5) %WL "%T" ZIP "" -mx9 -mm=Deflate -mfb=258 -mcu=on -pSECRET 
'  6) %WL "%T" 7Z txt,doc,bat,cmd, -mx9 -m0=LZMA2 -ssw -pПАРОЛЬ

' Автор - Flasher ©
'••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
' Установка и проверка параметров:
With WScript.Arguments
  On Error Resume Next
  List = .Item(0) : Path = .Item(1) : Ext  = .Item(2)
  If Err.Number > 0 Then
    MsgBox  "Не выбраны элементы для упаковки!", 48, Space(25) & "Пакетная упаковка"
    Wscript.Quit
  End If : On Error GoTo 0
  L = vbnewline : C = .Count : If C > 3 Then Filt = .Item(3)
  If Len(List) > 0 And .Count < 3 Then
    MsgBox  "Не выполнено условие:" & L & "минимальное число параметров - 3",_
    vbExclamation, Space(23) & "Пакетная упаковка"
    Wscript.Quit
  End If
  If C > 5 Then
    For i = 5 to C - 1 : S = S & " " & .Item(i) : Next
  End If
End With : Const M = 1
' Проверка поддержки указанного расширения архива:
Exts = "7Z | 7ZIP | ZIP | RAR | GZIP | BZIP2 | XZ | EXE | WIM"
If InStr(Exts, Ucase(Ext)) = 0 Then
  MsgBox "Указанное расширение """ & UCase(Ext) & """ не поддерживается!" & L &_
  L & "Список поддерживаемых расширений:" & L & Exts, 48,_
  Space(38) & "Пакетная упаковка" : WScript.Quit
End If
' Объявление объектов и переменных с путями к утилитам:
Set FSO = CreateObject("Scripting.FileSystemObject")
Dim WSH : Set WSH = CreateObject("WScript.Shell")
SZIP = "%COMMANDER_PATH%\Utils\7-Zip\7z.exe"
RAR  = "%COMMANDER_PATH%\Plugins\arc\rar.exe"
' Построение цикла для упаковки массива элементов:
For Each F in Split(FSO.GetFile(List).OpenAsTextStream(1, -1).ReadAll, L)
  If F > vbNullString Then
    If FSO.FileExists(F) Then
      If Len(Filt) > 0 Then
        Ext1 = LCase(FSO.GetExtensionName(F))
        If Ext1 <> "" Then
          If InStr(LCase(Filt), Ext1 & ",") > 0 Then Filtr F, SZIP, RAR, Ext, Path, S
        End If
      Else Filtr F, SZIP, RAR, Ext, Path, S
      End If
    Else
      Name = FSO.GetFileName(F) & "." & Ext : Str = ""
      If LCase(Ext) <> "rar" Then
        If Len(Filt) > 0 Then
          For Each E in Split(Filt, ",") : Str = Str & " """ & F & """*." & LCase(E) : Next
        Else Str = " """ & F & """*"
        End If
        WSH.Run """" & SZIP & """ a """ & Path & Name & """ """ & F & """*\" & Str & S, 0, True
      Else
        Set PF = FSO.GetFolder(F)
        For Each FF in PF.SubFolders : Period Str, FF, RAR, S, Path, Name : Next
        For Each FF in PF.Files
          If Len(Filt) > 0 Then
            Ext1 = LCase(FSO.GetExtensionName(FF))
            If Ext1 <> "" Then
              If InStr(LCase(Filt), Ext1 & ",") > 0 Then Period Str, FF, RAR, S, Path, Name
            End If
          Else Period Str, FF, RAR, S, Path, Name
          End If
        Next : If Str <> "" Then WSH.Run """" & RAR & """ a -ep1 -ri15" & S & " """ & Path & Name & """" & Str, 0, True
      End If
    End IF
  End If
Next
' Вывод сообщения и выход:
WSH.Popup "Упаковка завершена!", 1.4, "Результат", 64
Set FSO = Nothing : Set WSH = Nothing : WScript.Quit

' Процедура упаковки файлов:
Sub Filtr(FN, SZ, RA, Ex, P, K)
  Nm = FSO.GetBaseName(FN) & "." & Ex : Name = Nm : l = 0
  Do While FSO.FileExists(P & Name)
    l = l + 1 : If l < 10^M Then PostFix = Right(String(M, "0") & l, M) Else PostFix = l
    Name = Nm & " (" & PostFix & ")." & Ext
  Loop
  If LCase(Ex) <> "rar" Then
    Pr = SZ : Param = "a """ & P & Name & """ """ & FN & """" & K
  Else
    Pr = RA : Param = "a -ep1" & K & " """ & P & Name & """ """ & FN & """"
  End If : WSH.Run """" & Pr & """ " & Param, 0, True
End Sub
' Процедура упаковки папок в RAR по частям, исходя из ограничения длины комстроки:
Sub Period(St, FP, RR, K, Dir, NF)
  St = St & " """ & FP & """"
  If Len(St) > 1900 Then
    WSH.Run """" & RR & """ a -ep1 -ri15" & K & " """ & Dir & NF & """" & St, 0, True
    St = ""
  End If
End Sub
Пути к 7z.exe и rar.exe в переменных SZIP и RAR указать свои.

Добавлено: Пт авг 05, 2011 02:53
shveicar
Flasher -Огромное спасибо -за заботу, буду тестировать!

Добавлено: Пт авг 05, 2011 14:37
shveicar
Добрый день. Проверил скрипт, и вот что получается- если при архивировании (в данном случае пользовался win rar) выделены папки, с вложенными в них файлами - то скрипт срабатывает как положено (проверил варианты с "%T" и "%P") если использовать те-же параметры, но архивировать, только файлы(предварительно команда- DirBranch или поиск-отобразить всё) то скрипт не работает. В моем случае интересно- если можно архивировать много файлов вложенных в папки и желательно чтобы создаваемые архивы помещались в ту же папку, где находится исходный (архивируемый файл) ну и параметр "%Т" на всякий случай пусть тоже останется. Спасибо.

Добавлено: Пт авг 05, 2011 15:04
Flasher
shveicar писал(а):только файлы(DirBranch или поиск-отобразить всё) то скрипт не работает
Со всеми форматами кроме rar должно работать. С rar, увы, придётся смириться.
shveicar писал(а):В моем случае интересно- если можно архивировать много файлов вложенных в папки и желательно чтобы создаваемые архивы помещались в ту же папку, где находится исходный (архивируемый файл)
Очень кривой подход - мешать архивы с упаковываемыми файлами, ИМХО. Надо поменять Path на PF & "" в последних двух связках Path & Name.

Добавлено: Пт авг 05, 2011 15:22
shveicar
Flasher писал(а):Со всеми форматами кроме rar должно работать. С rar, увы, придётся смириться
Странно, а почему в скрипте от Batya rar работает?

Добавлено: Пт авг 05, 2011 15:33
Flasher
Где? Скрипт Batya не пакует выделенные файлы.

Добавлено: Пт авг 05, 2011 15:54
shveicar
Так, если бы он паковал выделенные файлы, то и вопросов бы не было.
Но, он ведь пакует выделенные папки с вложенными файлами и помещает архивы туда-же, где и исходники, я думал, что можно запаковать просто вложенные файлы. Или может-быть есть возможность использовать вариант, массового удаления из архивов лишних папок, чтобы остались запакованными только файлы? (что-то вроде перепаковки), хотя наверно это слишком сложно. Просто с 7zip не получается портабельности архиватора (плагины 7zip требуют установки обычного 7 zip), а портабельный win rar прекрасно работает.

Добавлено: Пт авг 05, 2011 16:10
Flasher
shveicar писал(а):Так, если бы он паковал выделенные файлы, то и вопросов бы не было.
Но, он ведь пакует выделенные папки с вложенными файлами и помещает архивы туда-же, где и исходники
См. контекст "цитата + ответ", что на что отвечено. Поэтому я не понял, к чему пример скрипта Batya.
shveicar писал(а):Или может-быть есть возможность использовать вариант, массового удаления из архивов лишних папок, чтобы остались запакованными только файлы?
Зачем удалять, если можно паковать только файлы?:
For Each FF in PF.SubFolders
Str = Str & " """ & FF & """"
Next
If Len(Filt) > 0 Then Str = ""
Можно удалить кусок полностью или добавить кр. строку на случай, когда требуется упаковывать только файлы из корней папок при указании фильтра.
shveicar писал(а):Просто с 7zip не получается портабельности архиватора (плагины 7zip требуют установки обычного 7 zip), а портабельный win rar прекрасно работает.
А то, что WinRar платный - ничего? Установка для 7zip - это всего лишь распаковка аналогичная WinRAR. Достаточно в соотв. подпапку TC скинуть файлы dll, sfx, 7z.exe - и будет портабельный вариант. Я скрипт под портабельность и затачивал (трудно не заметить переменные окружения...).