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

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

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

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

Сообщение Flasher »

Skif_off писал(а):Аргументы сомнению какие-нибудь есть?
Зачем сомнению аргументы? Аргументы должны быть у утверждения. Сомнения строятся на предположениях, иначе бы не было смысла предлагать проверить. Только тебе-то какая разница? Ты же этим не пользуешься.

Iori
Давай попробуем сделать. Только сперва мне нужна версия библиотеки, включая битность. Сам файл нужен. У меня 6.1.7601.17514 (win7sp1_rtm.101119-1850).
Iori писал(а):Решение очень хорошее.
А что там хорошего? Это же обычная регистрация.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Iori
Сообщения: 552
Зарегистрирован: Ср апр 25, 2012 20:33

Сообщение Iori »

Flasher
А что там хорошего? Это же обычная регистрация.
А нельзя ли сделать что-бы сам скрипт запускал

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

regsvr32 /s msado15.dll
, если не находит в реестре метку msado15.dll.
Давай попробуем сделать.
Спасибо за предложение. Способ который подсказал Skif_off, я скорее всего смогу сам осуществить.
У меня в TC есть кнопки для 7зип которые запускаются через батник. Работают без проблем. По этому я всегда могу использовать их там. Идея была убрать лишние кнопки и оставить только твой скрипт, но так что бы он работал универсально везде. Если это получиться без особо больших затрат, то хорошо, а если нет, то не беда.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Iori
Просто надо выбрать файл и выложить сюда. Чтобы работало на разных битностях, проще - сразу 32-битный. Есть ещё идея заменить на ChilkatCharset.dll (правда он Trial), только тогда мне придётся ещё скрипт править.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Flasher писал(а):Зачем
Как-то много слов, предположу, что предположение на пустом месте.
Flasher писал(а):Чтобы работало на разных битностях проще сразу 32-битный.
Не совсем проще: подсистему WOW64 в WinPEx64 добавляют нередко, но она бывает не исчерпывающей. Сталкивался с проблемами, тот же AkelPad при прочих равных: в AkelPad х64 всё работает, а AkelPad х86 скрипты выдают ошибку (хотя сами по себе файлы могут присутствовать, но без регистрации). Если затачивать под конкретную сборку, то лучше уточнить этот момент. Или вариант ниже.

Iori
Если прикручиваете к WinPE свою сборку ТС, то, может быть, через плагин AutoRun? В нём есть и FileExist (проверить наличие файлов), и RegRead (проверить регистрацию - один из ключей, в значении которого есть имя библиотеки), и ShellExec (зарегистрировать при необходимости). И разрядность ОС можно проверить. Если ТС будет использоваться и не в WinPE, то тогда нужно как-то это предусмотреть, например, наличие PECMD в "%WinDir%\System32" или LetterSwap (тут могут быть варианты *.au3, *.a3x, *.exe).
Хотя, наверное, через 7zSFX попроще всё это разрулить, включая разрядность...
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Skif_off писал(а):предположу, что предположение на пустом месте.
Уверяю, что твоё предположение беспочвенно. Я не находил в сети описание такой работы с WinPE, натыкался только на какие-то проблемы с манифестами.
Skif_off писал(а):Если затачивать под конкретную сборку, то лучше уточнить этот момент.
Можно и уточнить. А можно и под обе битности подогнать.
Skif_off писал(а):Или вариант ниже.
Вариант не ахти.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Iori
Сообщения: 552
Зарегистрирован: Ср апр 25, 2012 20:33

Сообщение Iori »

Flasher
Просто надо выбрать файл и выложить сюда
От десятки х64 (10.0.15063.296) 32 + 64бит.
http://rgho.st/8Cl4qvqJJ
Если прикручиваете к WinPE свою сборку ТС, то, может быть, через плагин AutoRun?
Как вы уже сказали, через 7zSFX будет удобнее.

Я говорю что у меня есть кнопки 7zip для Winpe. Я думал что подогнать скрипт, так что-бы работал под WinPE не будет тяжело.
Спасибо за альтернативное решение проблемы.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Iori
Решил по-другому (без ADO) сделать. Не так быстро как раньше, но, возможно, устроит:

[cut="Версия +WinPE"]

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

'•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
' Распаковка выбранных архивов и/или архивов в структуре выбранных каталогов
' в одноимённые папки рядом с архивами (при наличии в них более одного элемента)
' c автоматическим переходом в случае распаковки одного архива

' Условие: необходима текущая версия утилиты 7z.exe

' Параметры:
' 1. %WL (обязательный)
' 2. <расширения архивов (в т.ч. двойные) через "|"> ("" - все поддерживаемые)
' 3. <флаг распаковки одиночных элементов без подкаталогов: 1>
' 4. <пропустить/перезаписать существующие/переименовать извлекаемые файлы: s/a/u>
' 5. <флаг удаления распакованных архивов: 1>

' Примеры: %WL | %WL "" 1 | %WL 7z|7zip|arj|bzip2|rar|tar.bz2|zip | %WL "" 1 s 1

Option Explicit : Dim Z7
'••••••••• Путь к утилите 7z.exe •••••••••
Z7 = "%COMMANDER_PATH%\Utils\7-Zip\7z.exe"
'•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• Автор: Flasher © •••
Dim A, C, Filt, One, Mode, Del, List, WSS, FSO, XML, ShA, Reg, TF, F, Ch, Cn, It
Set A = WSH.Arguments : C = A.Count: If C = 0 Then WSH.Quit
If C > 1 Then Filt = LCase(A(1)) : If C > 2 Then One = A(2)
If C > 3 Then Mode = "-ao"& A(3) : If C > 4 Then Del = A(4)
List = A(0) : Set WSS = CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set XML = CreateObject("Msxml2.DOMDocument")
Set ShA = CreateObject("Shell.Application")
Set Reg = New Regexp
Reg.IgnoreCase = True : Reg.Pattern = "^(001|7z(|ip)|a|apm|arj?|bz(|ip)2|cab|cpio|ch[iqmw]" &_
"|cramfs|deb|dmg|docx?|e(sd|pub|xe|xt[234]?)|fat|gz(|ip)|hfsx?|hx[sirqw]|ihex|img|iso|jar|" &_
"li[bt]|l(zh|ma)|lha|mbr|ms(i|lz|sp)|mub|n(si|tf)s|od[st]|qcow(|2c?)|r00|rar|rpm|pkg|ppmd|" &_
"ppt|squashfs|scap|swm|t[agx]z|tar|tbz2?|u(d|efi)f|vdi|vhd|vmdk|wim|x(ar|lsx?|pi|z)|z|zipx?)$"
TF = FSO.GetSpecialFolder(2) & "\" & FSO.GetTempName
With FSO.OpenTextFile(List,,,-1)
  Do : F = Trim(.ReadLine)
    If F <> "" Then If FSO.FileExists("\\?\" & F) Then _
    ForFile F, Ch, It, Cn Else ForFolder F, Ch, It, Cn
  Loop Until .AtEndOfStream : .Close
End With
If Ch > 1 Then WSS.Popup "Распаковка завершена!", 1.4 , " Результат", 64
If Ch = 1 Then
  If Cn > 1 And FSO.FolderExists(It) Then It = FSO.GetParentFolderName(It)
  WSS.Exec "%COMMANDER_EXE% /A /S /O /L=""" & Replace(It, "\\?\", "") & """"
End If : If FSO.FileExists(List) Then FSO.DeleteFile List
If FSO.FileExists(TF) Then FSO.DeleteFile TF

Sub ForFile(Arch, T, F1, Sum)
  Dim Ext, BN, Ex, Arr, Item : Ext = LCase(FSO.GetExtensionName(Arch))
  BN = FSO.GetBaseName(Arch) : Ex  = LCase(FSO.GetExtensionName(BN))
  Ex = Len(Ex) * InStr("|" & Filt & "|", "|" & Ex & "." & Ext & "|")
  If (Filt = "" Or Ex Or InStr("|" & Filt & "|", "|" & Ext & "|")) And Reg.Test(Ext) Then
    WSS.Run "%comspec% /c chcp 65001&&echo off>" & TF & "&echo ^<?xml version=""" &_
            "1.0"" encoding=""utf-8""?^>^<a^>>>" & TF & "&&""" & Z7 & """ l -slt" &_
             " """ & Arch & """ -sccUTF-8>>" & TF & "&&echo ^</a^>>>" & TF, 0, True
    XML.Load TF : Arr = Split(XML.Text, "----------" & vbLf)(1)
    Arr = Filter(Split(Arr, vbLf), "Path = ") : XML.Abort
    Sum = Ubound(Arr) + 1 : If Sum > 0 Then Item = Split(Arr(0), " = ")(1)
    If Sum < 1 And Ext = "zip" And Len(Arch) < 260 Then
      Dim Items : Set Items = ShA.NameSpace(Arch).Items
      Sum = Items.Count : If Sum Then Item = Items.Item(0)
    End If
    If Sum > 0 Or FSO.GetFile(LPath(Arch)).Size Then
      Dim P, Fd, NF : P = FSO.GetParentFolderName(Arch)
      Fd = P & "\" & BN
      If Sum = 1 And (One = "1" Or BN = Item) Then NF = P Else NF = Fd
      F1 = NF & "\" & Item
      WSS.Run """" & Z7 & """ x """ & Arch & """ -o""" &_
              NF & """ " & Mode & " -y -p", 0, True : T = T + 1
      LPath(F1) : LPath(Fd) : LPath(Arch)
      If FSO.FileExists(F1) Then
          If Del = 1 And Sum = 1 Then FSO.DeleteFile Arch, 1
      ElseIf FSO.FolderExists(F1) Then
        If FSO.GetFolder(F1).Size Then
          If Del = 1 And Sum = 1 Then FSO.DeleteFile Arch, 1
        Else FSO.DeleteFolder F1, 1
        End If
      ElseIf FSO.FolderExists(Fd) Then
        If FSO.GetFolder(Fd).Size Then
          If Del = 1 Then FSO.DeleteFile Arch, 1
        Else FSO.DeleteFolder Fd, 1
        End If : F1 = Fd
      End If
    End If
  End If
End Sub

Sub ForFolder(Fold, T, F1, Cnt)
  Dim N : Set Fold = FSO.GetFolder(LPath(Fold))
  For Each N In Fold.SubFolders : ForFolder N.Path, Ch, It, Cnt : Next
  For Each N In Fold.Files      : ForFile   N.Path, Ch, It, Cnt : Next
End Sub

Function LPath(Obj)
  LPath = Obj : If Len(Obj) > 259 And Left(Obj, 1) <> "\" Then LPath = "\\?\" & Obj
End Function
[/cut]
Последний раз редактировалось Flasher Ср июн 28, 2017 20:55, всего редактировалось 1 раз.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Iori
Сообщения: 552
Зарегистрирован: Ср апр 25, 2012 20:33

Сообщение Iori »

Flasher

Ах Молодец 8) Спасибо Огромное.
Проверил в WinPE, работает. Если и медленнее работает как ты говоришь, то на долю секунды, не больше.

Заметил что когда скрипт распаковывает 7z sfx exe файл, то потом не переходит в папку с распакованными файлами.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Iori
Пож-та. Ну, я ощущаю поболее 1 дс.

Проверил sfx (внути неск. файлов) - переход есть. Скинь свой файл.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Iori
Сообщения: 552
Зарегистрирован: Ср апр 25, 2012 20:33

Сообщение Iori »

Flasher

Портабл версия SlimJet Browser.

http://www.slimjet.com/download.php?xp= ... a=&server=
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Iori
Вроде поправил. Но вообще это и TCKB-шной версии касается.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Iori
Сообщения: 552
Зарегистрирован: Ср апр 25, 2012 20:33

Сообщение Iori »

Flasher

Работает :)
А версия которая поддерживает WinPE, не будет на TCKB?
Всё-таки скрипт теперь универсальнее стал.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Iori
Не, не будет. Иначе бы только заменой текущего и обошлось. Скорость для меня приоритетней, да без темпизации.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Iori
Сообщения: 552
Зарегистрирован: Ср апр 25, 2012 20:33

Сообщение Iori »

Flasher
Понятно. Но ради интереса надо будет сделать тест скорости.

PS:
Вот такая ошибка выскакивает при попытке распаковки вот этого архива.
http://www.tweaking.com/files/setups/tw ... ir_aio.zip

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

Line:56
Char:19
Error: Subscript out of range [number:1]
code: 800A0009
Я полагаю дело в точках.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Iori
Мда. Вот тебе, бабушка, и Iori'ev (универсальный) день... :? Дело не в точках, а в амперсандах в путях/именах элементов архива. Пофиксить можно только заменой новоиспечённого метода чтения юникодного имени, к которому переходим. Есть, в принципе, в запасе один вариант, но он ещё помедленнее будет.

P.S.: Между ответами ровно сутки. :o
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Ответить