Рекурсивная пофайловая упаковка

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Nick
Сообщения: 107
Зарегистрирован: Пт дек 26, 2014 17:11

Сообщение Nick »

Flasher
Не планируется ли обновление скрипта с учетом упаковки _files?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

[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
[/cut]
Последний раз редактировалось Flasher Вт фев 03, 2015 19:26, всего редактировалось 4 раза.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Nick
Сообщения: 107
Зарегистрирован: Пт дек 26, 2014 17:11

Сообщение Nick »

Flasher
При параметрах %WL "" rar *.mht;*.htm;*.html получаю ошибку:
---------------------------
Строка: 105
Символ: 4
Ошибка: Недопустимое число аргументов или присвоение значения свойства
---------------------------
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Nick, см. добавку в 56 строке.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Nick
Сообщения: 107
Зарегистрирован: Пт дек 26, 2014 17:11

Сообщение Nick »

Flasher

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

Изображение
Если упаковывать несколько раз подряд (например, после правки html файла), то будет неправильная нумерация файлов.

Также хотелось бы еще добавить опцию, чтобы внутри одной папки все страницы упаковывались в один архив, т.е., например:
"Новая папка 1\Файлы html"
"Новая папка 1\Новая папка 2\Файлы html"
Чтобы внутри этих папок ("Новая папка 1" и "Новая папка 2") было бы по одному архиву со страницами.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Nick писал(а):если путь где-то более 300 символов
Тут ничего не поделаешь. 300? Ограничение API до 259 символов.
Остальное сделал.

[cut="P.S.:"]И как я должен воспринимать отмалчивания в разных ветках после публикаций решений?Изображение
Я не сервисная обслуга обладателей лицензии ТС, а такой же форумчанин, как и все. Изображение[/cut]
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Прошу прощения, не совсем понял, где проблемы с длиной пути? Здесь используется %WL и UNC-пути, по крайней мере отчётливо вижу префикс \\?\, 7-zip 9.30 и выше с ним точно работают (хотя на WinXP не все программы с префиксом нормально работают).
Или речь об этом скрипте?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Skif_off писал(а):Прошу прощения, не совсем понял, где проблемы с длиной пути?
Первый скриншот.
Skif_off писал(а):7-zip 9.30 и выше с ним точно работают
Как и rar. Но там про другое.
Skif_off писал(а):Или речь об этом скрипте?
Это можно проверить по дате последней правки поста. К посту доступ возможен в течение месяца с момента публикации. Не знал?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Flasher
Понял, где зарылась собака, только теперь не совсем понятно: как уживаются FSO.FolderExists(F) и префикс UNC-путей? MAX_PATH в VBScript уже отменили?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Skif_off
Им там и не приходится уживаться. А что значит "уже отменили"? Во встроенных компонентах его там и не было.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Nick
Сообщения: 107
Зарегистрирован: Пт дек 26, 2014 17:11

Сообщение Nick »

Flasher
Просто не каждый день бываю за компьютером и на форуме... Да и на тестирование тоже уходит определенное время. :wink:

Вроде бы с длинными путями стало более стабильно.
Когда пакуются файлы внтури одной папки в единый архив (параметры %WL . rar "" *.mht;*.htm;*.html), то лучше, чтобы не перезаписывался html файл (после каких-либо изменений), а добавлялся бы по номеру, т.е. также как и при упаковке файлов html по отдельным архивам (если, допустим, нужна будет перезапись, то ее можно сделать с помощью параметра архиватора -o+).
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Nick писал(а):Вроде бы с длинными путями стало более стабильно.
В смысле?ИзображениеПриведённое окно перестало появляться?
Nick писал(а):параметры %WL . rar "" *.mht;*.htm;*.html
Неверная запись. Отмеченных кавычек не должно быть.
Nick писал(а):лучше, чтобы не перезаписывался html файл (после каких-либо изменений), а добавлялся бы по номеру
Не вижу в этом смысла. Для обновления есть ключ -u, если что. А в 7-zip он имеет куда более гибкий функционал.

[cut=""Просто не каждый день бываю за компьютером и на форуме... Да и на тестирование тоже уходит определенное время.""]Не будем лукавить, его уходит значительно меньше, чем на процесс создания скрипта или добавку ряда опций. И выдавить из себя слово благодарности, доложив при этом о результатах (только один из примеров), ИМО, не должно являться какой-то непреодолимой проблемой.[/cut]
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Nick
Сообщения: 107
Зарегистрирован: Пт дек 26, 2014 17:11

Сообщение Nick »

Flasher писал(а):Приведённое окно перестало появляться?
Да, пока не наблюдаю его.
Flasher писал(а):Не вижу в этом смысла
Это удобно когда есть много версий файлов html, при замене они все потеряются, а иногда бывает, что нужно откатиться на более старую версию. При архивировании отдельных html файлов, будут копии, это удобно, сохраняться все версии.

Но, кода очень много таких файлов в одной папке, то для экономии места, все архивируется в единый архив. Поэтому хорошо, если бы добавлялось в единый архив также, как и в случае с отдельными файлами (тем более, при необходимости перезаписи можно использовать ключ -o+ или параметры a -u). При таком варианте старые версии файлов не потеряются. Это особенно важно, если такие вещи проделывать на большом множестве папок с длинными путями.
[cut="Прочее"]За скрипты, конечно большое спасибо. Этот скрипт пока не проверял на большом множестве файлов. Думаю, что может быть полезен и другим, кому приходится иметь дело не только с архивацией, но и перемещением страниц (как пример при перемещении их на USB flash-накопитель). Да и занимаемое место может значительно уменьшиться.
Изображение
Таких окон обычно больше десятка, поэтому бывает, что, что-то могу проследить или вообще еще не успеть посмотреть, что и получилось со скриптом по ссылке. Или вообще бывает, что сессию в браузере приходится заменять...[/cut]

[mod="Avada"]Синтаксис тегов для спойлеров желательно проверять на предпросмотре. И не забывать ставить кавычки.[/mod]

Добавлено спустя 6 минут:

Avada
Просто, не успел еще исправить, увидел, когда уже отправил сообщение, а уже Вы написали... (на разных форумах разный синтаксис, а теги вставляю, часто вручную. Да и не все теги бывают прописаны... :wink:
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Nick писал(а):Да, пока не наблюдаю его.
Видимо, не в тех же условиях тесты проводятся. Нужно со структурой проверять.
Nick писал(а):Это удобно когда есть много версий файлов html, при замене они все потеряются, а иногда бывает, что нужно откатиться на более старую версию. При архивировании отдельных html файлов, будут копии, это удобно, сохраняться все версии.
С трудом себе представляю, когда кто-то плодит у себя версии html-страниц. И в любом случае я не считаю, что за переделки внутри архива должен отвечать скрипт. Этим должен заниматься архиватор. А архиватор, увы, может переименовывать только уже имеющиеся файлы, а не те, что добавляются в архив. Да и включать дополнительный листинг файлов внутри скрипта дело муторное с учётом различной глубины вложенности, это всяко будет на скорости негативно сказываться.

[cut="Прочее"]Ну, может, благодарность ещё в ЛС переместим или вообще мне на мыло отправим, чего уж там в спойлер прятать? Изображение
Полезность - вещь сугубо индивидуальная. Экономия на текстовых файлах давно неактуальная задача. У меня одна из флешек - 240 Гб. Кого мне там экономить? Поэтому безотносительно местами надуманной общественной полезности нужно не забывать, что запрос актуален прежде всего для вопрошающего, за ним и ответка.

Вкладки же имеет смысл держать при изучении информации. Для всего остального достаточно подфорума или главной страницы, где можно всё проследить и увидеть. И никто не мешает использовать расширения для оптимизации работы с ушками.[/cut]
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Nick
Сообщения: 107
Зарегистрирован: Пт дек 26, 2014 17:11

Сообщение Nick »

Поскольку в этой теме никто не отвечает, то, напишу здесь.
Что надо изменить в этом скрипте, чтобы в названии архива также присутствовало и расширение оригинального файла?
Ответить