Пакетное архивирование
Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik
-
Старый Ворчун
- Сообщения: 13
- Зарегистрирован: Ср мар 30, 2005 18:10
- Откуда: Северный Кавказ
Пакетное архивирование
Подскажите как настроить пакетное архивирование в TC для автоматизированного пополнения архива, если папки для архивирования постоянно пополняются?
То есть есть, скажем, 5 больших папок, в каждой из них по нескольку десятков подпапок, названия и число этих подпапок - величина переменная. Требуется автоматическое создание архивов для каждой из этих подпапок...
В ручном режиме в тотале это можно проделать с помощью опции "Отдельные архивы для каждого выбранного...", а вот как это можно автоматизировать - я никак не соабражу :(
И попутно - второй вопрос: как подключить опцию "Отдельные архивы для каждого выбранного...", чтобы она была включена автоматически при вызове функции архивирования?
[mod="Avada"]В связи с подъёмом старой темы она переносится в "Автоматизацию".[/mod]
То есть есть, скажем, 5 больших папок, в каждой из них по нескольку десятков подпапок, названия и число этих подпапок - величина переменная. Требуется автоматическое создание архивов для каждой из этих подпапок...
В ручном режиме в тотале это можно проделать с помощью опции "Отдельные архивы для каждого выбранного...", а вот как это можно автоматизировать - я никак не соабражу :(
И попутно - второй вопрос: как подключить опцию "Отдельные архивы для каждого выбранного...", чтобы она была включена автоматически при вызове функции архивирования?
[mod="Avada"]В связи с подъёмом старой темы она переносится в "Автоматизацию".[/mod]
Не сердись, всё пройдёт...
Старый Ворчун
По первому вопросу...
Я не понял слов по поводу "автоматизированного пополнения архива". Ты хочешь для каждой подпапки создавать отдельный архив? Если - да, то о каком пополнении идет речь?
И что делать, если архив для подпапки уже существует? Заменять его новым или не архивировать, если архив уже есть?
По второму вопросу...
Никак.
Совет - нужно исправить lng-файл коммандера таким образом, чтобы назначить удобную горячую клавишу Alt+{символ} для нужного чекбокса. В данном случае для строки '5492="..."' убери амперсанд (&) внутри строки и добавь его в начало строки с символом какой-нибудь цифры, например - '5492="&6 ..."'. Т.о., когда нажимаешь Alt+F5 для архивирования, не отпуская Alt жми цифру 6, и будет тебе счастье
По первому вопросу...
Я не понял слов по поводу "автоматизированного пополнения архива". Ты хочешь для каждой подпапки создавать отдельный архив? Если - да, то о каком пополнении идет речь?
И что делать, если архив для подпапки уже существует? Заменять его новым или не архивировать, если архив уже есть?
По второму вопросу...
Никак.
Совет - нужно исправить lng-файл коммандера таким образом, чтобы назначить удобную горячую клавишу Alt+{символ} для нужного чекбокса. В данном случае для строки '5492="..."' убери амперсанд (&) внутри строки и добавь его в начало строки с символом какой-нибудь цифры, например - '5492="&6 ..."'. Т.о., когда нажимаешь Alt+F5 для архивирования, не отпуская Alt жми цифру 6, и будет тебе счастье
Нет, я не сплю. Я просто медленно моргаю.
-
Старый Ворчун
- Сообщения: 13
- Зарегистрирован: Ср мар 30, 2005 18:10
- Откуда: Северный Кавказ
Непонятно? Попробую пояснить:
есть ряд папок, которые существуют постоянно, в каждой из них по нескольку сотен подпапок, которые и нужно архивировать. У этих подпапок могут меняться названия, меняется их содержание.
Требуется создание архива для каждой из этих подпапок, но так как заранее неизвестно сколько и какие папки будут помещены в архив, то написать как скрипт для пакетного архивирования я не знаю... :cry:
Вся проблема в том, что нельзя поместить в архив всю большую папку целиком, так как размер каждого архивного файла (папка вместе со всеми вложенными подпапками) будет в лучшем случае несколько сотен Мб, а в некоторых случаях - перевалит за Гб! С такими архивами крайне сложно работать, да и переносить их, скажем, на DVD или CD крайне неудобно - бывает надо резать и т.д. Вот и требуется, чтобы автоматически периодически создавались архивы для каждой подпапки...
Если данный архив уже существует, его можно пополнить, если нет - создать заново... В принципе, даже можно каждый раз перезаписывать архивы.
Например, в программе PowerArchiver 9.61.03 есть такая опция - пакетное архивирование, но папки для архивирования надо указывать вручную каждый раз...
Такой скрипт я пробовал писать в WinRarе, но он иногда глючит - некоторые архивы потом не читаются...
Я понятно объяснил? :lol:
есть ряд папок, которые существуют постоянно, в каждой из них по нескольку сотен подпапок, которые и нужно архивировать. У этих подпапок могут меняться названия, меняется их содержание.
Требуется создание архива для каждой из этих подпапок, но так как заранее неизвестно сколько и какие папки будут помещены в архив, то написать как скрипт для пакетного архивирования я не знаю... :cry:
Вся проблема в том, что нельзя поместить в архив всю большую папку целиком, так как размер каждого архивного файла (папка вместе со всеми вложенными подпапками) будет в лучшем случае несколько сотен Мб, а в некоторых случаях - перевалит за Гб! С такими архивами крайне сложно работать, да и переносить их, скажем, на DVD или CD крайне неудобно - бывает надо резать и т.д. Вот и требуется, чтобы автоматически периодически создавались архивы для каждой подпапки...
Если данный архив уже существует, его можно пополнить, если нет - создать заново... В принципе, даже можно каждый раз перезаписывать архивы.
Например, в программе PowerArchiver 9.61.03 есть такая опция - пакетное архивирование, но папки для архивирования надо указывать вручную каждый раз...
Такой скрипт я пробовал писать в WinRarе, но он иногда глючит - некоторые архивы потом не читаются...
Я понятно объяснил? :lol:
Не сердись, всё пройдёт...
Код: Выделить всё
'==========================================================================
' Создание отдельных архивов для каждой вложенной папки в выделенных папках
' В параметрах вызова из 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
Скрипт работает по отмеченным "большим" папкам (всё ж таки этот форум про TC, поэтому в TC надо что-то делать
Если что-то работает не совсем так, как ты хочешь, пиши - поправлю скрипт.
-
Старый Ворчун
- Сообщения: 13
- Зарегистрирован: Ср мар 30, 2005 18:10
- Откуда: Северный Кавказ
Здравствуйте Batya - а можно изменить скрипт так, чтобы он был бы, с такими параметрами (желательно изменяемыми)
например:
например:
- 1 выбор типа архива( rar, zip, ну если возможно sfx)
2 выбор степени сжатия
3 добавление 5% на восстановление
4 возможность создания пароля(естественно одинакового, для всех упакованных за один раз архивов)
5 возможность выбора имени(полное имя файла или полное имя файла с датой- год, месяц, день на конце)
6 ну и возможность выбора директории создания - текущая панель, противоположная панель.
Добрый День. С предыдущей просьбой, как я понял, все слишком сложно. Но подскажите хотя-бы, что изменить в приведенном скрипте , чтобы он архивировал не вложенные папки в выделенных каталогах, а файлы(в данном случае видео с расширениями .wmv, mov, mp4, avi ну если есть возможность изменять параметры- расширения, архивируемых файлов будет просто здорово), вложенные в выделенные каталоги. Спасибо.
shveicar, пляши!
Пути к 7z.exe и rar.exe в переменных SZIP и RAR указать свои.
Код: Выделить всё
'••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
' Упаковать каждый файл или содержимое каждой папки в отдельный архив
' Параметры (! - обязательный):
' 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
Последний раз редактировалось Flasher Пт сен 07, 2018 18:01, всего редактировалось 8 раз.
Добрый день. Проверил скрипт, и вот что получается- если при архивировании (в данном случае пользовался win rar) выделены папки, с вложенными в них файлами - то скрипт срабатывает как положено (проверил варианты с "%T" и "%P") если использовать те-же параметры, но архивировать, только файлы(предварительно команда- DirBranch или поиск-отобразить всё) то скрипт не работает. В моем случае интересно- если можно архивировать много файлов вложенных в папки и желательно чтобы создаваемые архивы помещались в ту же папку, где находится исходный (архивируемый файл) ну и параметр "%Т" на всякий случай пусть тоже останется. Спасибо.
Со всеми форматами кроме rar должно работать. С rar, увы, придётся смириться.shveicar писал(а):только файлы(DirBranch или поиск-отобразить всё) то скрипт не работает
Очень кривой подход - мешать архивы с упаковываемыми файлами, ИМХО. Надо поменять Path на PF & "" в последних двух связках Path & Name.shveicar писал(а):В моем случае интересно- если можно архивировать много файлов вложенных в папки и желательно чтобы создаваемые архивы помещались в ту же папку, где находится исходный (архивируемый файл)
Последний раз редактировалось Flasher Пт авг 05, 2011 17:38, всего редактировалось 1 раз.
Так, если бы он паковал выделенные файлы, то и вопросов бы не было.
Но, он ведь пакует выделенные папки с вложенными файлами и помещает архивы туда-же, где и исходники, я думал, что можно запаковать просто вложенные файлы. Или может-быть есть возможность использовать вариант, массового удаления из архивов лишних папок, чтобы остались запакованными только файлы? (что-то вроде перепаковки), хотя наверно это слишком сложно. Просто с 7zip не получается портабельности архиватора (плагины 7zip требуют установки обычного 7 zip), а портабельный win rar прекрасно работает.
Но, он ведь пакует выделенные папки с вложенными файлами и помещает архивы туда-же, где и исходники, я думал, что можно запаковать просто вложенные файлы. Или может-быть есть возможность использовать вариант, массового удаления из архивов лишних папок, чтобы остались запакованными только файлы? (что-то вроде перепаковки), хотя наверно это слишком сложно. Просто с 7zip не получается портабельности архиватора (плагины 7zip требуют установки обычного 7 zip), а портабельный win rar прекрасно работает.
См. контекст "цитата + ответ", что на что отвечено. Поэтому я не понял, к чему пример скрипта Batya.shveicar писал(а):Так, если бы он паковал выделенные файлы, то и вопросов бы не было.
Но, он ведь пакует выделенные папки с вложенными файлами и помещает архивы туда-же, где и исходники
Зачем удалять, если можно паковать только файлы?:shveicar писал(а):Или может-быть есть возможность использовать вариант, массового удаления из архивов лишних папок, чтобы остались запакованными только файлы?
Можно удалить кусок полностью или добавить кр. строку на случай, когда требуется упаковывать только файлы из корней папок при указании фильтра.For Each FF in PF.SubFolders
Str = Str & " """ & FF & """"
Next
If Len(Filt) > 0 Then Str = ""
А то, что WinRar платный - ничего? Установка для 7zip - это всего лишь распаковка аналогичная WinRAR. Достаточно в соотв. подпапку TC скинуть файлы dll, sfx, 7z.exe - и будет портабельный вариант. Я скрипт под портабельность и затачивал (трудно не заметить переменные окружения...).shveicar писал(а):Просто с 7zip не получается портабельности архиватора (плагины 7zip требуют установки обычного 7 zip), а портабельный win rar прекрасно работает.