Распаковка выбранных InnoSetup c разбросом PE по x86/x64
Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер
Распаковка выбранных InnoSetup c разбросом PE по x86/x64
Не знаю если такое уже было здесь.
Нужна кнопка для распаковки инсталяционных пакетов 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, которая определяет разрядность файла.
Нужна кнопка для распаковки инсталяционных пакетов 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, которая определяет разрядность файла.
Последний раз редактировалось Iori Вт ноя 06, 2018 03:27, всего редактировалось 6 раз.
- LonerD
- Сообщения: 1174
- Зарегистрирован: Вт янв 04, 2011 03:56
- Откуда: Макеевка
- Контактная информация:
В случае если файлы имеют приписки ,1 и ,2 получается простой алгоритм действий - распаковать всё кучей, сделать копию распакованной папки, в одной папке удалить всё файлы с ",2" в названии, а остальные - переименовать, удалить все ",1" из названий. Во второй папке - наоборот. Вручную такая процедура делается минуты за три с помощью поиска и группового переименования в тотале, для одного случая скрипт сочинять намного дольше, чем переименовать.
А вот для универсальности уже сложнее что-то придумать, там бывают ещё и другие приписки, и битность или ОС могут быть указаны по разному, и может быть распаковка под одним именем (как в MediaInfo)...
А вот для универсальности уже сложнее что-то придумать, там бывают ещё и другие приписки, и битность или ОС могут быть указаны по разному, и может быть распаковка под одним именем (как в MediaInfo)...
Windows 11 | TC DreamLair eternal pre-α
Не получается. Там архитектура не соответствует порядковому номеру. Также есть общие дублируемые в обе папки файлы. К тому же есть подкаталоги с неизвестной максимальной глубиной, с содержимым которых тоже надо повозиться.LonerD писал(а):получается простой алгоритм действий
Я вижу следующий подход (с учётом, что глубина в {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.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Так и есть.Flasher писал(а):Не получается. Там архитектура не соответствует порядковому номеру.
Спасибо за совет, но это далеко не идеальный вариант.Flasher писал(а):Я вижу следующий подход (с учётом, что глубина в {app} не более 1):
А если упростить задание? Батник или скрипт который перемещает из всех выбранных файлов, исполняемые файлы по разрядности в папки х32 и х64, а файлы которые не соответствуют маске, в обе папки.
Да, ладно. Мелочиться ещё...
Код: Выделить всё
'==================================== 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
Последний раз редактировалось Flasher Вт ноя 06, 2018 02:43, всего редактировалось 9 раз.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Ну ты даешьFlasher писал(а):Да, ладно. Мелочиться ещё...
Я вообще не знал что такое через скрипт даже возможно осилить, а ты не только осилил, но и ещё так быстро.
Мне это дело до этого брало минут 10 перебирать, а сейчас в считаные секунды.
Огромное тебе спасибо. Просто класс.
Думаю скрипт пригодится многим. Помнится, в теме Universal Unpacker на ру борде, просили люди сделать что то подобное. Так автор и не сделал.
Одну маленькую багу нашёл.
Если в {app} есть папки которые не содержат исполняемые файлы, то эти папки не копируются в обе папке х86 и х64, а только в х86.
Пример тут
Так же activevdsk,1.sys и activevdsk,2.sys остались в папке х86.
PS: И маленькую просьбу. Можно сделать что бы диалог Выполнено!закрывался после секунды или две.
Если exe-ков много, то вряд ли в секунды.Iori писал(а):а сейчас в считаные секунды.
Да пож-та. Не сказать, что очень хотелось делать. Задачка казалась одноразовой.Iori писал(а):Огромное тебе спасибо. Просто класс.
Ленивый, поди.Iori писал(а):Так автор и не сделал.
C учётом того, сколько c кучей exe всё это занимает времени, а ты, например, ушёл выпить чашечку к-O-O-O-ф-э-э (или по другим нуждам), стоит ли делать короткий сигнал об окончании?Iori писал(а):Можно сделать что бы диалог Выполнено!закрывался после секунды или две
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
На SSD первый пример с undelete-demo.exe взял 10 секунд.Flasher писал(а):Если exe-ков много, то вряд ли в секунды.
Как бы заканчиваютсяFlasher писал(а):Ничего подобного не должно быть, если базовые имена не заканчиваются на ,№.
Извини, но это хороший экземпляр для теста.Flasher писал(а):Ты бы ещё гигов на 10 скинул. o_0
У меня это очень быстро происходит. Тут моргнуть не успеешь, а про кофе забыть можно.Flasher писал(а):C учётом того, сколько c кучей exe всё это занимает времени, а ты, например, ушёл выпить чашечку к-O-O-O-ф-э-э, стоит ли делать короткий сигнал об окончании?
Что то такое надо добавить:
Код: Выделить всё
MsgBox Space(13) & "Выполнено!" 1.4 , 4160, "Распаковка exe-файлов Inno Setup " Iori
Так ты что, по одному файлу собрался распаковывать?
А зачем я тогда делал для всех exe в папке?
С другой стороны на твой "хороший экземпляр" на SSD ушло секунд 45. Я успел чаю себе налить, взять печенюшек и залить кипяток в термос. Вернулся — увидел окно, что всё закончено.

В общем, сделал, как ты хочешь. Проверяй.
И, кстати, исполняемые файлы без ,1/,2 на конце как распределять?
[cut="Список из "хорошего экземпляра":"]activevdskapi.dll
Diexplorer.exe
Diexplorer_x64.exe
msg.dll
msvcp90.dll
msvcr90.dll
QtCore4.dll
QtGui4.dll
QtNetwork4.dll
shcpy_2k3.dll
shcpy_2k3x64.dll
shcpy_xp.dll
virtdisk.exe[/cut]P.S.: Cлед. версия будет вдвое быстрее (без детектора — не нужен).
Так ты что, по одному файлу собрался распаковывать?
А зачем я тогда делал для всех exe в папке?
С другой стороны на твой "хороший экземпляр" на SSD ушло секунд 45. Я успел чаю себе налить, взять печенюшек и залить кипяток в термос. Вернулся — увидел окно, что всё закончено.
Ты, наверно, как в подписи.Iori писал(а):Тут моргнуть не успеешь
В общем, сделал, как ты хочешь. Проверяй.
И, кстати, исполняемые файлы без ,1/,2 на конце как распределять?
[cut="Список из "хорошего экземпляра":"]activevdskapi.dll
Diexplorer.exe
Diexplorer_x64.exe
msg.dll
msvcp90.dll
msvcr90.dll
QtCore4.dll
QtGui4.dll
QtNetwork4.dll
shcpy_2k3.dll
shcpy_2k3x64.dll
shcpy_xp.dll
virtdisk.exe[/cut]P.S.: Cлед. версия будет вдвое быстрее (без детектора — не нужен).
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Нет конечно. Просто тест проводил на одном файле.Flasher писал(а):Так ты что, по одному файлу собрался распаковывать?
Правильно делал. Так всегда более удобнее. Меньше раз кликать на кнопку.Flasher писал(а):А зачем я тогда делал для всех exe в папке?
У меня на этот экземпляр ушло 27 секунд и я ещё на SATA 2 сижу.Flasher писал(а):С другой стороны на твой "хороший экземпляр" на SSD ушло секунд 45
Так что бы кофе себе приготовить, надо быть кофейным ниндзей.
Подпись классFlasher писал(а):Ты, наверно, как в подписи.
Эти файлы должны копироваться в обе папки.Flasher писал(а):И, кстати, исполняемые файлы без ,1/,2 на конце как распределять?
В install_script.iss прописано так:
Код: Выделить всё
{app}\QtCore4.dll"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: ignoreversionУ тебя скрипт уже это делает.
Проверил новую версию скрипта, всё работает отлично. Огромное тебе спасибо о Мастер Скриптов
Если без детектора, значит через install_script.iss ?Flasher писал(а):P.S.: Cлед. версия будет вдвое быстрее (без детектора — не нужен).
Встань с него и подключи лучше к диску и материнке, пож-та. А лучше SATA 3, как у меня.Iori писал(а):У меня на этот экземпляр ушло 27 секунд и я ещё на SATA 2 сижу.
"DestDir: "{app}"; Flags: ignoreversion" есть у всех файлов без исключения. Это ни о чём не говорит. И зачем, например, Diexplorer_x64.exe и shcpy_2k3x64.dll в папке x86?Iori писал(а):В install_script.iss прописано так:
Погоди благодарить до обновки.Iori писал(а):Огромное тебе спасибо о Мастер Скриптов
И без него.Iori писал(а):Если без детектора, значит через install_script.iss ?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Буду думать как решать эту проблему. У меня старая материнка с SATA 2. Думаю куплю pcie sata 3 контроллер карточку.Flasher писал(а):А лучше SATA 3, как у меня.
Я знаю, дурдом. Такие inno пакеты попадаются не так часто, но всё же.Flasher писал(а):И зачем, например, Diexplorer_x64.exe и shcpy_2k3x64.dll в папке x86?
Вот это интересно. Что же ты там придумал...Flasher писал(а):И без него.
Ну, так, может, с наличием x64 в имени тоже переносить?Iori писал(а):Я знаю, дурдом.
Ничего особенного. Ищу по PE-маркеру в байтах заголовка.Iori писал(а):Что же ты там придумал.
P.S.: Что-то ты задержался..
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Конечно. Я думал у тебя скрипт по идеи должен переносить раз используется детектор разрядности. Детектору же всё ровно какое название у файлов.Flasher писал(а):Ну, так, может, с наличием x64 в имени тоже переносить?
Про это не подумал.Flasher писал(а):Ничего особенного. Ищу по PE-маркеру в байтах заголовка.
Разбирался с новым Самсунг SSD и кучей CRC ошибок (9000+) при записи на диск. Но это уже другой разговор.Flasher писал(а):P.S.: Что-то ты задержался..
Так зачем мне все файлы проверять, если на переименование идут только с ,1/,2 в конце, с чего ты и начал?Iori писал(а): Я думал у тебя скрипт по идеи должен переносить раз используется детектор разрядности.
Кстати, имена указанных файлов на x64-системе при обычной установке (можно в песочнице) остаются прежними? Или без x64?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.