View previous topic :: View next topic |
Author |
Message |
Iori
Joined: 25 Apr 2012 Posts: 551
|
(Separately) Posted: Thu Nov 01, 2018 00:13 Post subject: Распаковка выбранных 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, которая определяет разрядность файла.
Last edited by Iori on Tue Nov 06, 2018 04:27; edited 6 times in total |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1169 Location: Макеевка
|
(Separately) Posted: Thu Nov 01, 2018 03:19 Post subject: |
|
|
В случае если файлы имеют приписки ,1 и ,2 получается простой алгоритм действий - распаковать всё кучей, сделать копию распакованной папки, в одной папке удалить всё файлы с ",2" в названии, а остальные - переименовать, удалить все ",1" из названий. Во второй папке - наоборот. Вручную такая процедура делается минуты за три с помощью поиска и группового переименования в тотале, для одного случая скрипт сочинять намного дольше, чем переименовать.
А вот для универсальности уже сложнее что-то придумать, там бывают ещё и другие приписки, и битность или ОС могут быть указаны по разному, и может быть распаковка под одним именем (как в MediaInfo)... _________________ Windows 11 | TC DreamLair eternal pre-α |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Thu Nov 01, 2018 11:38 Post subject: |
|
|
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. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
Iori
Joined: 25 Apr 2012 Posts: 551
|
(Separately) Posted: Fri Nov 02, 2018 01:41 Post subject: |
|
|
Flasher wrote: | Не получается. Там архитектура не соответствует порядковому номеру. |
Так и есть.
Flasher wrote: | Я вижу следующий подход (с учётом, что глубина в {app} не более 1): |
Спасибо за совет, но это далеко не идеальный вариант.
А если упростить задание? Батник или скрипт который перемещает из всех выбранных файлов, исполняемые файлы по разрядности в папки х32 и х64, а файлы которые не соответствуют маске, в обе папки. |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Fri Nov 02, 2018 02:16 Post subject: |
|
|
Да, ладно. Мелочиться ещё...
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 |
_________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Last edited by Flasher on Tue Nov 06, 2018 03:43; edited 9 times in total |
|
Back to top |
|
|
Iori
Joined: 25 Apr 2012 Posts: 551
|
(Separately) Posted: Fri Nov 02, 2018 03:06 Post subject: |
|
|
Flasher wrote: | Да, ладно. Мелочиться ещё... |
Ну ты даешь
Я вообще не знал что такое через скрипт даже возможно осилить, а ты не только осилил, но и ещё так быстро.
Мне это дело до этого брало минут 10 перебирать, а сейчас в считаные секунды.
Огромное тебе спасибо. Просто класс.
Думаю скрипт пригодится многим. Помнится, в теме Universal Unpacker на ру борде, просили люди сделать что то подобное. Так автор и не сделал.
Одну маленькую багу нашёл.
Если в {app} есть папки которые не содержат исполняемые файлы, то эти папки не копируются в обе папке х86 и х64, а только в х86.
Пример тут
Так же activevdsk,1.sys и activevdsk,2.sys остались в папке х86.
PS: И маленькую просьбу. Можно сделать что бы диалог Выполнено!закрывался после секунды или две. |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Fri Nov 02, 2018 03:42 Post subject: |
|
|
Iori wrote: | а сейчас в считаные секунды. | Если exe-ков много, то вряд ли в секунды.
Iori wrote: | Огромное тебе спасибо. Просто класс. | Да пож-та. Не сказать, что очень хотелось делать. Задачка казалась одноразовой.
Iori wrote: | Так автор и не сделал. | Ленивый, поди.
Iori wrote: | Можно сделать что бы диалог Выполнено!закрывался после секунды или две | C учётом того, сколько c кучей exe всё это занимает времени, а ты, например, ушёл выпить чашечку к-O-O-O-ф-э-э (или по другим нуждам), стоит ли делать короткий сигнал об окончании? _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
Iori
Joined: 25 Apr 2012 Posts: 551
|
(Separately) Posted: Fri Nov 02, 2018 04:46 Post subject: |
|
|
Flasher wrote: | Если exe-ков много, то вряд ли в секунды. |
На SSD первый пример с undelete-demo.exe взял 10 секунд.
Flasher wrote: | Ничего подобного не должно быть, если базовые имена не заканчиваются на ,№. |
Как бы заканчиваются В одной папке это были иконки с номерами с конце файла. В другой папке номеров не было.
Flasher wrote: | Ты бы ещё гигов на 10 скинул. o_0 |
Извини, но это хороший экземпляр для теста.
Flasher wrote: | C учётом того, сколько c кучей exe всё это занимает времени, а ты, например, ушёл выпить чашечку к-O-O-O-ф-э-э, стоит ли делать короткий сигнал об окончании? |
У меня это очень быстро происходит. Тут моргнуть не успеешь, а про кофе забыть можно.
Что то такое надо добавить:
Code: | MsgBox Space(13) & "Выполнено!" 1.4 , 4160, "Распаковка exe-файлов Inno Setup " |
|
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Fri Nov 02, 2018 05:01 Post subject: |
|
|
Iori
Так ты что, по одному файлу собрался распаковывать?
А зачем я тогда делал для всех exe в папке?
С другой стороны на твой "хороший экземпляр" на SSD ушло секунд 45. Я успел чаю себе налить, взять печенюшек и залить кипяток в термос. Вернулся — увидел окно, что всё закончено.
Iori wrote: | Тут моргнуть не успеешь | Ты, наверно, как в подписи.
В общем, сделал, как ты хочешь. Проверяй.
И, кстати, исполняемые файлы без ,1/,2 на конце как распределять?
Список из "хорошего экземпляра": 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 P.S.: Cлед. версия будет вдвое быстрее (без детектора — не нужен). _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
Iori
Joined: 25 Apr 2012 Posts: 551
|
(Separately) Posted: Fri Nov 02, 2018 18:09 Post subject: |
|
|
Flasher wrote: | Так ты что, по одному файлу собрался распаковывать? | Нет конечно. Просто тест проводил на одном файле.
Flasher wrote: | А зачем я тогда делал для всех exe в папке? |
Правильно делал. Так всегда более удобнее. Меньше раз кликать на кнопку.
Flasher wrote: | С другой стороны на твой "хороший экземпляр" на SSD ушло секунд 45 |
У меня на этот экземпляр ушло 27 секунд и я ещё на SATA 2 сижу.
Так что бы кофе себе приготовить, надо быть кофейным ниндзей.
Flasher wrote: | Ты, наверно, как в подписи. |
Подпись класс
Flasher wrote: | И, кстати, исполняемые файлы без ,1/,2 на конце как распределять? |
Эти файлы должны копироваться в обе папки.
В install_script.iss прописано так:
Code: | {app}\QtCore4.dll"; DestDir: "{app}"; MinVersion: 0.0,5.0; Flags: ignoreversion |
Что означает что при инсталляции, это файл будет скопирован в папку в независимо от разрядности системы.
У тебя скрипт уже это делает.
Проверил новую версию скрипта, всё работает отлично. Огромное тебе спасибо о Мастер Скриптов
Flasher wrote: | P.S.: Cлед. версия будет вдвое быстрее (без детектора — не нужен). |
Если без детектора, значит через install_script.iss ? |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Fri Nov 02, 2018 19:23 Post subject: |
|
|
Iori wrote: | У меня на этот экземпляр ушло 27 секунд и я ещё на SATA 2 сижу. | Встань с него и подключи лучше к диску и материнке, пож-та. А лучше SATA 3, как у меня.
Iori wrote: | В install_script.iss прописано так: | "DestDir: "{app}"; Flags: ignoreversion" есть у всех файлов без исключения. Это ни о чём не говорит. И зачем, например, Diexplorer_x64.exe и shcpy_2k3x64.dll в папке x86?
Iori wrote: | Огромное тебе спасибо о Мастер Скриптов | Погоди благодарить до обновки.
Iori wrote: | Если без детектора, значит через install_script.iss ? | И без него. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
Iori
Joined: 25 Apr 2012 Posts: 551
|
(Separately) Posted: Sun Nov 04, 2018 00:39 Post subject: |
|
|
Flasher wrote: | А лучше SATA 3, как у меня. |
Буду думать как решать эту проблему. У меня старая материнка с SATA 2. Думаю куплю pcie sata 3 контроллер карточку.
Flasher wrote: | И зачем, например, Diexplorer_x64.exe и shcpy_2k3x64.dll в папке x86? |
Я знаю, дурдом. Такие inno пакеты попадаются не так часто, но всё же.
Flasher wrote: | И без него. |
Вот это интересно. Что же ты там придумал... |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Sun Nov 04, 2018 01:16 Post subject: |
|
|
Iori wrote: | Я знаю, дурдом. | Ну, так, может, с наличием x64 в имени тоже переносить?
Iori wrote: | Что же ты там придумал. | Ничего особенного. Ищу по PE-маркеру в байтах заголовка.
P.S.: Что-то ты задержался.. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
Iori
Joined: 25 Apr 2012 Posts: 551
|
(Separately) Posted: Sun Nov 04, 2018 01:38 Post subject: |
|
|
Flasher wrote: | Ну, так, может, с наличием x64 в имени тоже переносить? |
Конечно. Я думал у тебя скрипт по идеи должен переносить раз используется детектор разрядности. Детектору же всё ровно какое название у файлов.
Flasher wrote: | Ничего особенного. Ищу по PE-маркеру в байтах заголовка. |
Про это не подумал.
Flasher wrote: | P.S.: Что-то ты задержался.. |
Разбирался с новым Самсунг SSD и кучей CRC ошибок (9000+) при записи на диск. Но это уже другой разговор. |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Sun Nov 04, 2018 01:48 Post subject: |
|
|
Iori wrote: | Я думал у тебя скрипт по идеи должен переносить раз используется детектор разрядности. | Так зачем мне все файлы проверять, если на переименование идут только с ,1/,2 в конце, с чего ты и начал?
Кстати, имена указанных файлов на x64-системе при обычной установке (можно в песочнице) остаются прежними? Или без x64? _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|