Распаковка выбранных InnoSetup c разбросом PE по x86/x64
Select messages from
# through # FAQ
[/[Print]\]
Goto page 1, 2, 3, 4  Next  :| |:
Total Commander -> Автоматизация Total Commander

#1: Распаковка выбранных InnoSetup c разбросом PE по x86/x64 Author: Iori PostPosted: Thu Nov 01, 2018 00:13
    —
Не знаю если такое уже было здесь.
Нужна кнопка для распаковки инсталяционных пакетов Inno Setup, в папки х86 и х64 из папки {app}, и переименовать файлы в нормальный вид. Общие файлы (pdf, doc, txt, jpg), должны быть в обеих папках.
Кнопка должна работать, как с файлом под курсором, так и с выбранными файлами.

Сам inno setup, распаковывается с помощью Inno Setup Unpacker.
Пример inno setup пакета.
Информация разрядности находится в файле install_script.iss.
В ручную это дело перебирать очень тяжко.
Файлы в папке {app}, находятся в таком формате: api-ms-win-core-console-l1-1-0,1.dll и api-ms-win-core-console-l1-1-0,2.dll.
Можно задействовать программу EXE 64bit Detector, которая определяет разрядность файла.


Last edited by Iori on Tue Nov 06, 2018 04:27; edited 6 times in total

#2:  Author: LonerDLocation: Донецк PostPosted: Thu Nov 01, 2018 03:19
    —
В случае если файлы имеют приписки ,1 и ,2 получается простой алгоритм действий - распаковать всё кучей, сделать копию распакованной папки, в одной папке удалить всё файлы с ",2" в названии, а остальные - переименовать, удалить все ",1" из названий. Во второй папке - наоборот. Вручную такая процедура делается минуты за три с помощью поиска и группового переименования в тотале, для одного случая скрипт сочинять намного дольше, чем переименовать.
А вот для универсальности уже сложнее что-то придумать, там бывают ещё и другие приписки, и битность или ОС могут быть указаны по разному, и может быть распаковка под одним именем (как в MediaInfo)...

#3:  Author: FlasherLocation: Москва PostPosted: Thu Nov 01, 2018 11:38
    —
LonerD wrote:
получается простой алгоритм действий
Не получается. Там архитектура не соответствует порядковому номеру. Также есть общие дублируемые в обе папки файлы. К тому же есть подкаталоги с неизвестной максимальной глубиной, с содержимым которых тоже надо повозиться.

Я вижу следующий подход (с учётом, что глубина в {app} не более 1):
1. Распаковать exe Multiarc-ом с опцией отдельных архивов.
2. Найти с регулярным выражением ,[1-2]\.(exe|dll|ocx)$ в выбранных папках со вторым уровнем глубины и вывести на панель.
3. Ctrl+A, Ctrl+M, вставить в первое поле ..\x[=isdotnet.TypeText:1-2]\[N1--3] и выполнить.
4. Повторить 2 п., только с третьим уровнем.
5. Повторить 3 п. только с выражением: ..\..\x[=isdotnet.TypeText:1-2]\[P]\[N1--3]
6. Найти все папки x32, выделить и группой переименовать в x86.
7. Найти все папки {app}, вывести на панель и выделить.
8. Найти в них всё (с путым полем) и вывести на панель.
9. Ctrl+A, Ctrl+M, с маской ..\x86\[N] выполнить.
10. Повторить п. 7 и удалить по Shift+Del.

#4:  Author: Iori PostPosted: Fri Nov 02, 2018 01:41
    —
Flasher wrote:
Не получается. Там архитектура не соответствует порядковому номеру.

Так и есть.

Flasher wrote:
Я вижу следующий подход (с учётом, что глубина в {app} не более 1):

Спасибо за совет, но это далеко не идеальный вариант.

А если упростить задание? Батник или скрипт который перемещает из всех выбранных файлов, исполняемые файлы по разрядности в папки х32 и х64, а файлы которые не соответствуют маске, в обе папки.

#5:  Author: FlasherLocation: Москва PostPosted: Fri Nov 02, 2018 02:16
    —
Да, ладно. Мелочиться ещё...
Code:
'==================================== VBS ====================================
' Распаковать exe-файлы Inno Setup активного каталога с распределением файлов
' по каталогам, имена которых соответствуют разрядности этих файлов:  x86/x64

' Условие: путь запуска — пустой
' Параметр: %WF (без него или выбора объектов будут вовлечены все exe-файлы)
' /o   —   ключ перехода в созданный каталог при распаковке одного exe-файла

Option Explicit : SetLocale 1049
'============================ Путь к распаковщику ============================
Const InnoUnp = """%COMMANDER_PATH%\Plugins\wcx\MultiArc\Addons\innounp.exe"""
'======================================================== Автор: Flasher © ===
Dim FSO, Dic, ShA, WSS, T, Arg, Rgx, CD, Exts, HLink, Items, C, i, BN, FBN, Fl
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Dic = CreateObject("Scripting.Dictionary")
Set ShA = CreateObject("Shell.Application")
Set WSS = CreateObject("WScript.Shell")
Set Rgx = New RegExp : T = Timer
Set Arg = WSH.Arguments

CD = FSO.BuildPath(WSS.CurrentDirectory, "\")
If Not FSO.FolderExists(CD) Then WScript.Quit
If StrComp(CD, FSO.GetParentFolderName(WSH.ScriptFullName) & "\", 1) = 0 Then WSH.Quit
Exts = "*,1." & Replace("acm;acx;ax;com;cnv;cpl;dll;drv;exe;fmt;lib;msi;ocx;scr;pnf;qtx;" &_
"scf;scp;sdb;so;sys;theme;tlb;vxd;vdf;wcx;wcx64;wdx;wdx64;wfx;wfx64;wlx;wlx64", ";", ";*,1.")
If WSS.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion") > "5.1" _
Then HLink = "%ComSpec% /q/c mklink /h" Else HLink = "fsutil hardlink create"
Rgx.Global = 1 : Rgx.MultiLine = 1 : Rgx.Pattern = ".+\.[Ee][Xx][Ee]$"
If Arg.UnNamed.Count > 0 Then _
Set Items = Rgx.Execute(FSO.OpenTextFile(Arg(0),,,-1).ReadAll) Else _
Set Items = ShA.NameSpace(CD).Items : Items.Filter 73920, "*.exe"
If Items.Count = 0 Then WSH.Quit
Rgx.Pattern = "(,\d|[_—\-]?x?64)(?=\.[A-z]+$)"
For i = 0 To Items.Count - 1
  BN = FSO.GetBaseName(Items.Item(i))
  If Not FSO.FolderExists(BN) Then C = C + 1 : WSS.Run InnoUnp & " -x -d" &_
  """" & CD & BN & "\x86"" -c{app} -a -y """ & Items.Item(i) & """", 0, 1 :_
  If FSO.GetFolder(BN).Size Then Recursion ShA.NameSpace(CD & BN & "\x86")
Next
If C > 0 Then If Arg.Named.Exists("o") And C = 1 Then _
WSS.Exec "%COMMANDER_EXE% /O /S """ & CD & BN & """" Else _
WSS.Popup Space(13) & "Выполнено!" & vbCr & " Время выполнения: " &_
TimeSerial(0, 0, Timer - T), 2, "Распаковка exe-файлов Inno Setup      ", 4160

Sub Recursion(Folder)
  If Not FSO.FileExists(Folder.Self.Path) Then
  Dim NPath, Itms, F1, F2, Fl, Fn : Set Itms = Folder.Items
  NPath = Replace(Folder.Self.Path & "\", "\x86\", "\x64\")
  ShA.NameSpace(Left(NPath, 3)).NewFolder Mid(NPath, 4)
  Itms.Filter 73920, Replace(Exts, ",1", "64")
  For Each Fl in Itms
    Fl = Fl.Path : FSO.GetFile(Fl).Move NPath
    Dic.Add Rgx.Replace(Fl, ""), Empty
  Next
  For Each Fl in FSO.GetFolder(Folder.Self.Path).Files
    If Rgx.Test(Fl.Path) = 0 Then If Not Dic.Exists(Fl.Path) Then _
    WSS.Run HLink & " """ & NPath & "\" & Fl.Name & """ """ & Fl & """", 0
  Next : Dic.RemoveAll
  Itms.Filter 73920, Exts
  If Itms.Count > 0 Then
    For Each F1 in Itms
      FBN = FSO.GetBaseName(F1.Path)
      Set F2 = Folder.ParseName(Left(FBN, Len(FBN) - 1) & "2" & Right(F1.Path, 4))
      If Is64bit(F1) Then Set Fl = F1 : Set Fn = F2 Else Set Fl = F2 : Set Fn = F1
      FSO.MoveFile Fl.Path, NPath & Rgx.Replace(FSO.GetFileName(Fl.Path), "")
      Fn.Name = Rgx.Replace(FSO.GetFileName(Fn.Path), "")
    Next
  End If : Itms.Filter 73888, "*"
  For Each i in Itms : Recursion i.GetFolder : Next
  End If
End Sub

Function Is64bit(oF)
  Dim ArrB, PE, S
  With CreateObject("SAPI.SpFileStream")
    .Open oF.Path : .Seek(60) : .Read ArrB, 1 : .Seek AscB(ArrB) + 4
    .Read ArrB, 2 : PE = AscB(ArrB) & AscB(MidB(ArrB, 2))
    If PE <> 761 And PE <> 100134 Then
      .Seek 4
      For i = 1 To oF.Size
        .Read ArrB, 1 : S = S & AscB(ArrB)
        If InStrRev(S, "806900") Then .Read ArrB, 2 : Exit For
      Next : PE = AscB(ArrB) & AscB(MidB(ArrB, 2)) : S = Empty
    End If : .Close
  End With : Is64bit = Eval(PE = 100134)
End Function


Last edited by Flasher on Tue Nov 06, 2018 03:43; edited 9 times in total

#6:  Author: Iori PostPosted: Fri Nov 02, 2018 03:06
    —
Flasher wrote:
Да, ладно. Мелочиться ещё...

Ну ты даешь Shocked
Я вообще не знал что такое через скрипт даже возможно осилить, а ты не только осилил, но и ещё так быстро. Cool
Мне это дело до этого брало минут 10 перебирать, а сейчас в считаные секунды.
Огромное тебе спасибо. Просто класс.

Думаю скрипт пригодится многим. Помнится, в теме Universal Unpacker на ру борде, просили люди сделать что то подобное. Так автор и не сделал.

Одну маленькую багу нашёл.
Если в {app} есть папки которые не содержат исполняемые файлы, то эти папки не копируются в обе папке х86 и х64, а только в х86.
Пример тут
Так же activevdsk,1.sys и activevdsk,2.sys остались в папке х86.

PS: И маленькую просьбу. Можно сделать что бы диалог Выполнено!закрывался после секунды или две.

#7:  Author: FlasherLocation: Москва PostPosted: Fri Nov 02, 2018 03:42
    —
Iori wrote:
а сейчас в считаные секунды.
Если exe-ков много, то вряд ли в секунды.
Iori wrote:
Огромное тебе спасибо. Просто класс.
Да пож-та. Не сказать, что очень хотелось делать. Задачка казалась одноразовой.
Iori wrote:
Так автор и не сделал.
Ленивый, поди. Wink
Iori wrote:
Можно сделать что бы диалог Выполнено!закрывался после секунды или две
C учётом того, сколько c кучей exe всё это занимает времени, а ты, например, ушёл выпить чашечку к-O-O-O-ф-э-э (или по другим нуждам), стоит ли делать короткий сигнал об окончании?

#8:  Author: Iori PostPosted: Fri Nov 02, 2018 04:46
    —
Flasher wrote:
Если exe-ков много, то вряд ли в секунды.

На SSD первый пример с undelete-demo.exe взял 10 секунд.

Flasher wrote:
Ничего подобного не должно быть, если базовые имена не заканчиваются на ,№.

Как бы заканчиваются Surprised В одной папке это были иконки с номерами с конце файла. В другой папке номеров не было.

Flasher wrote:
Ты бы ещё гигов на 10 скинул. o_0

Извини, но это хороший экземпляр для теста.

Flasher wrote:
C учётом того, сколько c кучей exe всё это занимает времени, а ты, например, ушёл выпить чашечку к-O-O-O-ф-э-э, стоит ли делать короткий сигнал об окончании?

У меня это очень быстро происходит. Тут моргнуть не успеешь, а про кофе забыть можно.
Что то такое надо добавить:
Code:
MsgBox Space(13) & "Выполнено!" 1.4 , 4160, "Распаковка exe-файлов Inno Setup      "

#9:  Author: FlasherLocation: Москва PostPosted: Fri Nov 02, 2018 05:01
    —
Iori
Так ты что, по одному файлу собрался распаковывать? Confused
А зачем я тогда делал для всех exe в папке?
С другой стороны на твой "хороший экземпляр" на SSD ушло секунд 45. Я успел чаю себе налить, взять печенюшек и залить кипяток в термос. Вернулся — увидел окно, что всё закончено. Smile

Iori wrote:
Тут моргнуть не успеешь
Ты, наверно, как в подписи. Mr. Green

В общем, сделал, как ты хочешь. Проверяй.

И, кстати, исполняемые файлы без ,1/,2 на конце как распределять?
 Список из "хорошего экземпляра":
P.S.: Cлед. версия будет вдвое быстрее (без детектора — не нужен).

#10:  Author: Iori PostPosted: Fri Nov 02, 2018 18:09
    —
Flasher wrote:
Так ты что, по одному файлу собрался распаковывать?
Нет конечно. Просто тест проводил на одном файле.
Flasher wrote:
А зачем я тогда делал для всех exe в папке?

Правильно делал. Так всегда более удобнее. Меньше раз кликать на кнопку.
Flasher wrote:
С другой стороны на твой "хороший экземпляр" на SSD ушло секунд 45

У меня на этот экземпляр ушло 27 секунд и я ещё на SATA 2 сижу.
Так что бы кофе себе приготовить, надо быть кофейным ниндзей.

Flasher wrote:
Ты, наверно, как в подписи.

Подпись класс Mr. Green

Flasher wrote:
И, кстати, исполняемые файлы без ,1/,2 на конце как распределять?

Эти файлы должны копироваться в обе папки.
В install_script.iss прописано так:
Code:
{app}\QtCore4.dll"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: ignoreversion

Что означает что при инсталляции, это файл будет скопирован в папку в независимо от разрядности системы.
У тебя скрипт уже это делает.

Проверил новую версию скрипта, всё работает отлично. Огромное тебе спасибо о Мастер Скриптов Very Happy

Flasher wrote:
P.S.: Cлед. версия будет вдвое быстрее (без детектора — не нужен).

Если без детектора, значит через install_script.iss ?

#11:  Author: FlasherLocation: Москва PostPosted: Fri Nov 02, 2018 19:23
    —
Iori wrote:
У меня на этот экземпляр ушло 27 секунд и я ещё на SATA 2 сижу.
Встань с него и подключи лучше к диску и материнке, пож-та. А лучше SATA 3, как у меня. Wink
Iori wrote:
В install_script.iss прописано так:
"DestDir: "{app}"; Flags: ignoreversion" есть у всех файлов без исключения. Это ни о чём не говорит. И зачем, например, Diexplorer_x64.exe и shcpy_2k3x64.dll в папке x86?
Iori wrote:
Огромное тебе спасибо о Мастер Скриптов
Погоди благодарить до обновки. Smile
Iori wrote:
Если без детектора, значит через install_script.iss ?
И без него.

#12:  Author: Iori PostPosted: Sun Nov 04, 2018 00:39
    —
Flasher wrote:
А лучше SATA 3, как у меня.

Буду думать как решать эту проблему. У меня старая материнка с SATA 2. Думаю куплю pcie sata 3 контроллер карточку.

Flasher wrote:
И зачем, например, Diexplorer_x64.exe и shcpy_2k3x64.dll в папке x86?

Я знаю, дурдом. Такие inno пакеты попадаются не так часто, но всё же.

Flasher wrote:
И без него.

Вот это интересно. Что же ты там придумал... Very Happy

#13:  Author: FlasherLocation: Москва PostPosted: Sun Nov 04, 2018 01:16
    —
Iori wrote:
Я знаю, дурдом.
Ну, так, может, с наличием x64 в имени тоже переносить?
Iori wrote:
Что же ты там придумал.
Ничего особенного. Ищу по PE-маркеру в байтах заголовка.

P.S.: Что-то ты задержался..

#14:  Author: Iori PostPosted: Sun Nov 04, 2018 01:38
    —
Flasher wrote:
Ну, так, может, с наличием x64 в имени тоже переносить?

Конечно. Я думал у тебя скрипт по идеи должен переносить раз используется детектор разрядности. Детектору же всё ровно какое название у файлов.

Flasher wrote:
Ничего особенного. Ищу по PE-маркеру в байтах заголовка.

Про это не подумал.

Flasher wrote:
P.S.: Что-то ты задержался..

Разбирался с новым Самсунг SSD и кучей CRC ошибок (9000+) при записи на диск. Но это уже другой разговор.

#15:  Author: FlasherLocation: Москва PostPosted: Sun Nov 04, 2018 01:48
    —
Iori wrote:
Я думал у тебя скрипт по идеи должен переносить раз используется детектор разрядности.
Так зачем мне все файлы проверять, если на переименование идут только с ,1/,2 в конце, с чего ты и начал?
Кстати, имена указанных файлов на x64-системе при обычной установке (можно в песочнице) остаются прежними? Или без x64?



Total Commander -> Автоматизация Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page 1, 2, 3, 4  Next  :| |:
Page 1 of 4

Powered by phpBB © 2001, 2005 phpBB Group