Рекурсивная пофайловая упаковка
Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер
[cut="Планируется:"][/cut]
Код: Выделить всё
'••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
' Опциональная упаковка выбранных файлов или файлов в структуре
' выбранных каталогов (htm(l) упаковываются вместе со своими каталогами)
' Параметры (! - обязательный):
' 1. <путь к списку элементов в Юникоде> (!)
' 2. "<путь назначения>\" (!)
' а) если добавить в конец точку, то все файлы - в один архив;
' б) если написать точку, то файлы каждой папки - в одноименный архив;
' в) если написать "", то - рядом с исходником;
' г) если написать "имя папки", то - в папку рядом с исходником;
' имя папки должно быть уникальным для выбранной структуры.
' 3. <расширение архива> (!)
' 4. *.<ext1>;*.<ext2>;*.<ext3> (маски расширений файлов)
' 5. <параметры упаковки>
' Примеры:
' 1) %WL "" zip
' 2) %WL "%P" RAR
' 3) "C:\My Files\List.txt" 1 exe "" -sfx7z.sfx
' 4) %WL . 7z "" -mx9 -m0=LZMA2:fb273 -m1=LZMA2:lc4
' 5) %WL "" rar "" -m5 -s -rr5p -pPASSWORD -ag_DD.MM.YY
' 6) %WL "%T" ZIP "" -mx9 -mm=Deflate -mfb=258 -mcu=on -pSECRET
' 7) %WL "%T." 7Z *.mht;*.htm;*.html -mx9 -m0=LZMA2 -ssw -pПАРОЛЬ
' Автор - Flasher ©
'••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
Option Explicit
Dim SZIP, RAR, Title, A, C, P, Ext, List, Filt, Arch, Exts, E,_
i, S, WSH, ShA, FSO, F, T, Text, Folder, Test, Items, Fl, Fd,_
File, Extn, FF, Ex, Path, PP, Name, l, PostFix, Pr, Param
'••••••••• Путь к утилите 7z.exe ••••••••••••
SZIP = "%COMMANDER_PATH%\Utils\7-Zip\7z.exe"
'••••••••• Путь к утилите rar.exe •••••••••••
RAR = "%COMMANDER_PATH%\Plugins\arc\rar.exe"
'••••••••••••••••••••••••••••••••••••••••••••
Title = "Рекурсивная пофайловая упаковка"
Set A = WScript.Arguments
C = A.Count : If C = 0 Then WScript.Quit
List = A.Item(0) : P = A.Item(1) : Ext = A.Item(2)
If C > 3 Then Filt = A.Item(3)
If Len(List) > 0 And A.Count < 3 Then
MsgBox "Не выполнено условие:" & vbLf & "минимальное число параметров - 3",_
vbExclamation, " " & Title : Wscript.Quit
End If
Exts = "7Z | 7ZIP | ZIP | RAR | GZIP | BZIP2 | XZ | EXE | WIM"
If InStr(" " & Exts & " ", " " & Ucase(Ext) & " ") = 0 Then
MsgBox "Указанное расширение """ & UCase(Ext) & """ не поддерживается!" &_
vbLf & vbLf & "Список поддерживаемых расширений:" &_
vbLf & Exts, 48, Space(20) & Title : WScript.Quit
End If
If C > 5 Then For i = 5 To C - 1 : S = S & " " & A(i) : Next End If
If InStr(P, ":") And Right(P, 1) = "." Then
Arch = Trim(InputBox(String(5, vbLf) & "Введите базовое имя архива:",_
Space(18) & Title, "Новый_архив")) : If Arch = "" Then WScript.Quit
P = Left(P, Len(P) - 1)
End If
Set WSH = CreateObject("WScript.Shell")
Set ShA = CreateObject("Shell.Application")
Set FSO = CreateObject("Scripting.FileSystemObject")
With FSO.OpenTextFile(List,,,-1)
Do : F = Trim(.ReadLine)
If F > vbNullString Then
If FSO.FolderExists(F) Then ForFolder F, T Else ForFile F, T
End If
Loop Until .AtEndOfStream : .Close
End With
Sub Info(Text) : WSH.Popup Text, 1.5 , " " & Title, 64 : End Sub
If T Then Info "Упаковка завершена!" Else Info "Нет подходящих объектов!"
Sub ForFolder(Folder, Test)
Set Folder = ShA.NameSpace(Folder)
Set Items = Folder.Items
Items.Filter 192, Filt : If Items.Count Then Test = 1
For Each Fl in Items : Run Fl.Path, FSO.GetExtensionName(Fl) : Next
Items.Filter 160, "*"
For Each Fd In Items
If Right(Fd, 6) <> "_files" Then ForFolder Fd.Path, Test
Next
End Sub
Sub ForFile(File, Test)
Extn = FSO.GetExtensionName(File)
If Len(Filt) Then
If Not Ubound(Filter(Split(LCase(Filt), ";"), "*." &_
LCase(Extn), True, 1)) Then Run File, Extn : Test = 1 End If
Else Run File, Extn : Test = 1
End If
End Sub
Sub Run(FF, Ex)
If InStr(P, ":") Then
Path = P
Else
PP = FSO.GetParentFolderName(FF) & "\"
If P <> "." And P <> "" Then PP = PP & P & "\"
If FSO.FolderExists(PP) Then Path = PP Else Path = FSO.CreateFolder(PP) & "\"
End If
If Len(Arch) Then
Name = Arch & "." & Ext
ElseIf P = "." Then
Name = FSO.GetFileName(Left(PP, Len(PP) - 1)) & "." & Ext
Else
Name = FSO.GetBaseName(FF) & "." & Ext
l = 0 : Const M = 1
Do While FSO.FileExists(Path & Name)
l = l + 1
If l < 10^M Then PostFix = Right(String(M, "0") & l, M) Else PostFix = l
Name = FSO.GetFileName(FF) & " (" & PostFix & ")." & Ext
Loop
End if
If LCase(Ex) = "htm" Or LCase(Ex) = "html" Then FF = """" & FF & """ """ &_
Left(FF, InStrRev(FF, Ex) - 2) & "_files""" Else FF = """" & FF & """"
If LCase(Ext) <> "rar" Then
Pr = SZIP : Param = "a """ & Path & Name & """ " & FF & S
Else
Pr = RAR : Param = "a -ep1" & S & " ""\\?\" & Path & Name & """ " & FF
End If : WSH.Run """" & Pr & """ " & Param, 0, True
End Sub
Последний раз редактировалось Flasher Вт фев 03, 2015 19:26, всего редактировалось 4 раза.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Flasher

Иногда бывают проблемы с длинными именами (т.е. бывает иногда, что не работает, если путь где-то более 300 символов).

Если упаковывать несколько раз подряд (например, после правки html файла), то будет неправильная нумерация файлов.
Также хотелось бы еще добавить опцию, чтобы внутри одной папки все страницы упаковывались в один архив, т.е., например:
"Новая папка 1\Файлы html"
"Новая папка 1\Новая папка 2\Файлы html"
Чтобы внутри этих папок ("Новая папка 1" и "Новая папка 2") было бы по одному архиву со страницами.

Иногда бывают проблемы с длинными именами (т.е. бывает иногда, что не работает, если путь где-то более 300 символов).

Если упаковывать несколько раз подряд (например, после правки html файла), то будет неправильная нумерация файлов.
Также хотелось бы еще добавить опцию, чтобы внутри одной папки все страницы упаковывались в один архив, т.е., например:
"Новая папка 1\Файлы html"
"Новая папка 1\Новая папка 2\Файлы html"
Чтобы внутри этих папок ("Новая папка 1" и "Новая папка 2") было бы по одному архиву со страницами.
Тут ничего не поделаешь. 300? Ограничение API до 259 символов.Nick писал(а):если путь где-то более 300 символов
Остальное сделал.
[cut="P.S.:"]И как я должен воспринимать отмалчивания в разных ветках после публикаций решений?

Я не сервисная обслуга обладателей лицензии ТС, а такой же форумчанин, как и все.
[/cut]Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Прошу прощения, не совсем понял, где проблемы с длиной пути? Здесь используется %WL и UNC-пути, по крайней мере отчётливо вижу префикс \\?\, 7-zip 9.30 и выше с ним точно работают (хотя на WinXP не все программы с префиксом нормально работают).
Или речь об этом скрипте?
Или речь об этом скрипте?
Первый скриншот.Skif_off писал(а):Прошу прощения, не совсем понял, где проблемы с длиной пути?
Как и rar. Но там про другое.Skif_off писал(а):7-zip 9.30 и выше с ним точно работают
Это можно проверить по дате последней правки поста. К посту доступ возможен в течение месяца с момента публикации. Не знал?Skif_off писал(а):Или речь об этом скрипте?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Skif_off
Им там и не приходится уживаться. А что значит "уже отменили"? Во встроенных компонентах его там и не было.
Им там и не приходится уживаться. А что значит "уже отменили"? Во встроенных компонентах его там и не было.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Flasher
Просто не каждый день бываю за компьютером и на форуме... Да и на тестирование тоже уходит определенное время.
Вроде бы с длинными путями стало более стабильно.
Когда пакуются файлы внтури одной папки в единый архив (параметры %WL . rar "" *.mht;*.htm;*.html), то лучше, чтобы не перезаписывался html файл (после каких-либо изменений), а добавлялся бы по номеру, т.е. также как и при упаковке файлов html по отдельным архивам (если, допустим, нужна будет перезапись, то ее можно сделать с помощью параметра архиватора -o+).
Просто не каждый день бываю за компьютером и на форуме... Да и на тестирование тоже уходит определенное время.
Вроде бы с длинными путями стало более стабильно.
Когда пакуются файлы внтури одной папки в единый архив (параметры %WL . rar "" *.mht;*.htm;*.html), то лучше, чтобы не перезаписывался html файл (после каких-либо изменений), а добавлялся бы по номеру, т.е. также как и при упаковке файлов html по отдельным архивам (если, допустим, нужна будет перезапись, то ее можно сделать с помощью параметра архиватора -o+).
В смысле?Nick писал(а):Вроде бы с длинными путями стало более стабильно.
Приведённое окно перестало появляться?
Неверная запись. Отмеченных кавычек не должно быть.Nick писал(а):параметры %WL . rar "" *.mht;*.htm;*.html
Не вижу в этом смысла. Для обновления есть ключ -u, если что. А в 7-zip он имеет куда более гибкий функционал.Nick писал(а):лучше, чтобы не перезаписывался html файл (после каких-либо изменений), а добавлялся бы по номеру
[cut=""Просто не каждый день бываю за компьютером и на форуме... Да и на тестирование тоже уходит определенное время.""]Не будем лукавить, его уходит значительно меньше, чем на процесс создания скрипта или добавку ряда опций. И выдавить из себя слово благодарности, доложив при этом о результатах (только один из примеров), ИМО, не должно являться какой-то непреодолимой проблемой.[/cut]
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Да, пока не наблюдаю его.Flasher писал(а):Приведённое окно перестало появляться?
Это удобно когда есть много версий файлов html, при замене они все потеряются, а иногда бывает, что нужно откатиться на более старую версию. При архивировании отдельных html файлов, будут копии, это удобно, сохраняться все версии.Flasher писал(а):Не вижу в этом смысла
Но, кода очень много таких файлов в одной папке, то для экономии места, все архивируется в единый архив. Поэтому хорошо, если бы добавлялось в единый архив также, как и в случае с отдельными файлами (тем более, при необходимости перезаписи можно использовать ключ -o+ или параметры a -u). При таком варианте старые версии файлов не потеряются. Это особенно важно, если такие вещи проделывать на большом множестве папок с длинными путями.
[cut="Прочее"]За скрипты, конечно большое спасибо. Этот скрипт пока не проверял на большом множестве файлов. Думаю, что может быть полезен и другим, кому приходится иметь дело не только с архивацией, но и перемещением страниц (как пример при перемещении их на USB flash-накопитель). Да и занимаемое место может значительно уменьшиться.

Таких окон обычно больше десятка, поэтому бывает, что, что-то могу проследить или вообще еще не успеть посмотреть, что и получилось со скриптом по ссылке. Или вообще бывает, что сессию в браузере приходится заменять...[/cut]
[mod="Avada"]Синтаксис тегов для спойлеров желательно проверять на предпросмотре. И не забывать ставить кавычки.[/mod]
Добавлено спустя 6 минут:
Avada
Просто, не успел еще исправить, увидел, когда уже отправил сообщение, а уже Вы написали... (на разных форумах разный синтаксис, а теги вставляю, часто вручную. Да и не все теги бывают прописаны...
Видимо, не в тех же условиях тесты проводятся. Нужно со структурой проверять.Nick писал(а):Да, пока не наблюдаю его.
С трудом себе представляю, когда кто-то плодит у себя версии html-страниц. И в любом случае я не считаю, что за переделки внутри архива должен отвечать скрипт. Этим должен заниматься архиватор. А архиватор, увы, может переименовывать только уже имеющиеся файлы, а не те, что добавляются в архив. Да и включать дополнительный листинг файлов внутри скрипта дело муторное с учётом различной глубины вложенности, это всяко будет на скорости негативно сказываться.Nick писал(а):Это удобно когда есть много версий файлов html, при замене они все потеряются, а иногда бывает, что нужно откатиться на более старую версию. При архивировании отдельных html файлов, будут копии, это удобно, сохраняться все версии.
[cut="Прочее"]Ну, может, благодарность ещё в ЛС переместим или вообще мне на мыло отправим, чего уж там в спойлер прятать?

Полезность - вещь сугубо индивидуальная. Экономия на текстовых файлах давно неактуальная задача. У меня одна из флешек - 240 Гб. Кого мне там экономить? Поэтому безотносительно местами надуманной общественной полезности нужно не забывать, что запрос актуален прежде всего для вопрошающего, за ним и ответка.
Вкладки же имеет смысл держать при изучении информации. Для всего остального достаточно подфорума или главной страницы, где можно всё проследить и увидеть. И никто не мешает использовать расширения для оптимизации работы с ушками.[/cut]
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Поскольку в этой теме никто не отвечает, то, напишу здесь.
Что надо изменить в этом скрипте, чтобы в названии архива также присутствовало и расширение оригинального файла?
Что надо изменить в этом скрипте, чтобы в названии архива также присутствовало и расширение оригинального файла?