Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Распаковка выбранных InnoSetup c разбросом PE по x86/x64
Goto page 1, 2, 3, 4  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Iori



Joined: 25 Apr 2012
Posts: 551

Post (Separately) Posted: Thu Nov 01, 2018 00:13    Post subject: Распаковка выбранных InnoSetup c разбросом PE по x86/x64 Reply with quote

Не знаю если такое уже было здесь.
Нужна кнопка для распаковки инсталяционных пакетов 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
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Thu Nov 01, 2018 03:19    Post subject: Reply with quote

В случае если файлы имеют приписки ,1 и ,2 получается простой алгоритм действий - распаковать всё кучей, сделать копию распакованной папки, в одной папке удалить всё файлы с ",2" в названии, а остальные - переименовать, удалить все ",1" из названий. Во второй папке - наоборот. Вручную такая процедура делается минуты за три с помощью поиска и группового переименования в тотале, для одного случая скрипт сочинять намного дольше, чем переименовать.
А вот для универсальности уже сложнее что-то придумать, там бывают ещё и другие приписки, и битность или ОС могут быть указаны по разному, и может быть распаковка под одним именем (как в MediaInfo)...
_________________
Win11 x64 Eng | TC DreamLair eternal pre-α
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Thu Nov 01, 2018 11:38    Post subject: Reply with quote

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
View user's profile Send private message
Iori



Joined: 25 Apr 2012
Posts: 551

Post (Separately) Posted: Fri Nov 02, 2018 01:41    Post subject: Reply with quote

Flasher wrote:
Не получается. Там архитектура не соответствует порядковому номеру.

Так и есть.

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

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

А если упростить задание? Батник или скрипт который перемещает из всех выбранных файлов, исполняемые файлы по разрядности в папки х32 и х64, а файлы которые не соответствуют маске, в обе папки.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Fri Nov 02, 2018 02:16    Post subject: Reply with quote

Да, ладно. Мелочиться ещё...
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
View user's profile Send private message
Iori



Joined: 25 Apr 2012
Posts: 551

Post (Separately) Posted: Fri Nov 02, 2018 03:06    Post subject: Reply with quote

Flasher wrote:
Да, ладно. Мелочиться ещё...

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

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

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

PS: И маленькую просьбу. Можно сделать что бы диалог Выполнено!закрывался после секунды или две.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Fri Nov 02, 2018 03:42    Post subject: Reply with quote

Iori wrote:
а сейчас в считаные секунды.
Если exe-ков много, то вряд ли в секунды.
Iori wrote:
Огромное тебе спасибо. Просто класс.
Да пож-та. Не сказать, что очень хотелось делать. Задачка казалась одноразовой.
Iori wrote:
Так автор и не сделал.
Ленивый, поди. Wink
Iori wrote:
Можно сделать что бы диалог Выполнено!закрывался после секунды или две
C учётом того, сколько c кучей exe всё это занимает времени, а ты, например, ушёл выпить чашечку к-O-O-O-ф-э-э (или по другим нуждам), стоит ли делать короткий сигнал об окончании?
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Iori



Joined: 25 Apr 2012
Posts: 551

Post (Separately) Posted: Fri Nov 02, 2018 04:46    Post subject: Reply with quote

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      "
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Fri Nov 02, 2018 05:01    Post subject: Reply with quote

Iori
Так ты что, по одному файлу собрался распаковывать? Confused
А зачем я тогда делал для всех exe в папке?
С другой стороны на твой "хороший экземпляр" на SSD ушло секунд 45. Я успел чаю себе налить, взять печенюшек и залить кипяток в термос. Вернулся — увидел окно, что всё закончено. Smile

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

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

И, кстати, исполняемые файлы без ,1/,2 на конце как распределять?
 Список из "хорошего экземпляра":
P.S.: Cлед. версия будет вдвое быстрее (без детектора — не нужен).
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Iori



Joined: 25 Apr 2012
Posts: 551

Post (Separately) Posted: Fri Nov 02, 2018 18:09    Post subject: Reply with quote

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 ?
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Fri Nov 02, 2018 19:23    Post subject: Reply with quote

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 ?
И без него.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Iori



Joined: 25 Apr 2012
Posts: 551

Post (Separately) Posted: Sun Nov 04, 2018 00:39    Post subject: Reply with quote

Flasher wrote:
А лучше SATA 3, как у меня.

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

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

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

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

Вот это интересно. Что же ты там придумал... Very Happy
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Sun Nov 04, 2018 01:16    Post subject: Reply with quote

Iori wrote:
Я знаю, дурдом.
Ну, так, может, с наличием x64 в имени тоже переносить?
Iori wrote:
Что же ты там придумал.
Ничего особенного. Ищу по PE-маркеру в байтах заголовка.

P.S.: Что-то ты задержался..
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Iori



Joined: 25 Apr 2012
Posts: 551

Post (Separately) Posted: Sun Nov 04, 2018 01:38    Post subject: Reply with quote

Flasher wrote:
Ну, так, может, с наличием x64 в имени тоже переносить?

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

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

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

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

Разбирался с новым Самсунг SSD и кучей CRC ошибок (9000+) при записи на диск. Но это уже другой разговор.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Sun Nov 04, 2018 01:48    Post subject: Reply with quote

Iori wrote:
Я думал у тебя скрипт по идеи должен переносить раз используется детектор разрядности.
Так зачем мне все файлы проверять, если на переименование идут только с ,1/,2 в конце, с чего ты и начал?
Кстати, имена указанных файлов на x64-системе при обычной установке (можно в песочнице) остаются прежними? Или без x64?
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page 1, 2, 3, 4  Next
Page 1 of 4

 
Jump to:  
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