Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Перепаковка MSI при помощи WiMakCab.vbs (http://forum.oszone.net/showthread.php?t=344658)

m0nkrus 02-04-2020 10:47 2915533

Перепаковка MSI при помощи WiMakCab.vbs
 
Есть такой стандартный скрипт WiMakCab.vbs, идущий в комплекте с серверной виндой. С его помощью, кроме всего прочего, можно взять msi-инсталлер + комплект устанавливаемых файлов россыпью и превратить в msi-инсталлер + cab-архив, в который помещается все, что раньше было россыпью. Прежде чем упаковывать, скрипт создает промежуточный ddf-файл, в который помещает список файлов для упаковки. Так вот, для некоторых msi-инсталлеров этот ddf создается некорректно. Он просто теряет часть имен файлов. Как итог, результат становится непригодным для использования.

Я заметил закономерность, какие имена файлов попадают в ddf, а какие нет. Если залезть внутрь msi, то среди таблиц имеется File.idt. В ней каждая строка посвящена одному файлу.

Такого типа строки проходят в ddf:
Код:

SWL_ACAD_EXE        LCK_ACAD        acad.exe        5913984        30.0.47.0        0        0        3303
_3D_model.dwg._A476F1115068        _3D_model.dwg._A476F1115068        3D_model.dwg        128096                        0        15
_ASMBASEA.dll._0EE808D7680D        _ASMBASEA.dll._0EE808D7680D        kzz8rfng.dll|ASMBASE226A.dll        1307448        226.0.0.65535        0        0        571

А вот такие строки скриптом игнорируются:
Код:

TKY2JGD._par.1C7043BC_1407_4BA9_9B01_E0A7AB8D297A        TKY2JGD._par.1C7043BC_1407_4BA9_9B01_E0A7AB8D297A        ckybkio2._pa|TKY2JGD._par        4707900                        8704        3304ReadMe.txt.1C7043BC_1407_4BA9_9B01_E0A7AB8D297A        ReadMe.txt.1C7043BC_1407_4BA9_9B01_E0A7AB8D297A        ReadMe.txt        4358                        8704        3291
RDF_COMP_AecbPartBaseRes.dll.1F1E4850_FEE5_41E5_BFB        RDF_COMP_AecbPartBaseRes.dll.1F1E4850_FEE5_41E5_BFB        AecbPa~1.dll|AecbPartBaseRes.dll        419200        8.3.51.0        1033        8192        3276

Полагаю, разница в формате "хвоста" имени файла. Но вот что конкретно является причиной "выбивания" длинных "хвостов", длина ли имени, его формат, разделители, недостающие элементы строки или что-то еще, я уже понять не в состоянии. Кто-нибудь может помочь разобраться, а еще лучше допилить скрипт, чтобы он создавал ddf-файл с полным списком имен, чтобы получался рабочий результат?

Для тестирования прикладываю сам скрипт и один из msi-инсталлеров, с которым у меня проблемы: https://yadi.sk/d/sqR4R5DXyGEYxQ
Остальные установочные файлы не нужны. Чтобы создать ddf-файл запустите команду cscript WiMakCab.vbs acad.msi Data1

Iska 02-04-2020 22:26 2915624

m0nkrus, попроще бы. И пошагово.

m0nkrus 02-04-2020 22:48 2915626

Iska, куда уж проще? Тут шаг всего один! При запуске команды cscript WiMakCab.vbs acad.msi Data1 создается файл Data1.DDF в котором в определенном формате (текстовик) должна быть перечислены инфа о всех файлах, устанавливаемых msi-инсталлером. В данном конкретном случае инфа дается о 2456 файлах. Только вот должна быть информация о 3329 файлах. Вот эта почти тысяча выпавших файлов впоследствии не будет упакована в cab-архив. Смысл перепаковки теряется.

DJ Mogarych 03-04-2020 09:38 2915650

Судя по всему, если именование файлов различное, то берётся только один формат.
Я для перепаковки пользовался Wix toolset.

m0nkrus 03-04-2020 10:29 2915654

Цитата:

Цитата DJ Mogarych
Судя по всему, если именование файлов различное, то берётся только один формат. »

Гениальная мысль! Как же я до нее сам не дошел?!
Задача в том, чтобы не озвучить очевидное, а решить проблему как-то, если это возможно, подправив код скрипта.
Цитата:

Цитата DJ Mogarych
Я для перепаковки пользовался Wix toolset. »

И как им пользоваться? Скачал. Установил. В меню Пуск в папке WiX Toolset v3.11 ссылки только на мануалы. Какого-либо исполняемого файла нет.

Iska 03-04-2020 19:00 2915730

m0nkrus, насколько я понимаю, искомое здесь:
Код:

' Fetch each file and request the source path, then verify the source path
Dim fileKey, fileName, folder, sourcePath, delim, message, attributes
Do
        Set record = view.Fetch : CheckError
        If record Is Nothing Then Exit Do
        fileKey    = record.StringData(1)
        fileName  = record.StringData(2)
        folder    = record.StringData(3)
        sequence  = record.IntegerData(4)
        attributes = record.IntegerData(5)
        If (attributes And msidbFileAttributesNoncompressed) = 0 Then
                If sequence <= lastSequence Then
                        If Not sequenceFile Then Fail "Duplicate sequence numbers in File table, use /S option"
                        sequence = lastSequence + 1
                        record.IntegerData(4) = sequence
                        view.Modify msiViewModifyUpdate, record
                End If
                lastSequence = sequence
                delim = InStr(1, fileName, "|", vbTextCompare)
                If delim <> 0 Then
                        If shortNames Then fileName = Left(fileName, delim-1) Else fileName = Right(fileName, Len(fileName) - delim)
                End If
                sourcePath = session.SourcePath(folder) & fileName
                outStream.WriteLine """" & sourcePath & """" & " " & fileKey
                If installer.FileAttributes(sourcePath) = -1 Then message = message & vbNewLine & sourcePath
        End If
Loop
outStream.Close
REM Wscript.Echo "SourceDir = " & session.Property("SourceDir")
If Not IsEmpty(message) Then Fail "The following files were not available:" & message

Какие «файлы» попадают в выдачу? Только те «файлы», у которых поле Attributes содержит значение с не установленным семнадцатым битом (0x2000).

Т.е., вот это:
Код:

Const msidbFileAttributesNoncompressed = &h00002000
и вот это:
Код:

If (attributes And msidbFileAttributesNoncompressed) = 0 Then
    …
End If

приводит к тому, что все файлы, в поле Attributes которых содержатся значения 8192 или 8704, в выдачу не попадут.

m0nkrus 03-04-2020 19:44 2915733

Iska, я, ксожалению, в языке VBS не в зуб ногой. Это как-то можно исправить?

В выдачу не попадают файлы, типа тех, что во втором блоке в кода в шапке.

Iska 03-04-2020 22:16 2915751

m0nkrus, я бы исправил, если бы знал, что нужно исправлять и что нужно исправлять. И до́́лжно ли исправлять что-то. Вот в чём дело.

Если достаточно будет того, чтобы списки всех безусловно помещались в в файл .ddf — просто закомментируйте само условие апострофами:
Код:

        ' If (attributes And msidbFileAttributesNoncompressed) = 0 Then
                …
        ' End If


m0nkrus 03-04-2020 23:22 2915756

Iska, да, это решает проблему полного заполнения файла ddf. Увы, не решило проблему с упаковкой...
Закоментил, запустил команду cscript WiMakCab.vbs /C /U acad.msi Data1, разумеется при наличии всех файлов россыпью. Примерно на 75% обрабоки скрипт просто вырубился.
Попробовал на инсталлере меньшего размера. Там всего пять файлов выпадают. Обычно я эти пять файлов просто кладу рядом с инсталлером и он при установке их подхватывает. Так вот, попробовал - все упаковалось. Запускаю готовый инсталлер, но он не смотря на то, что все файлы упакованы в cab (5 файлов россыпью не добавлял) все равно просит наличия пресловутых пяти файлов...

Я бы дал вам этот мелкий инсталлер, да только он не работает самостоятельно - только в составе пакета.
Если есть желание покопаться, то вот техзадача:

1. Скачать https://trial2.autodesk.com/NetSWDLD...it_dlm.sfx.exe
2. Запустить AutoCAD_2021_English_Win_64bit_dlm.sfx.exe, чтобы получить распакованный дистрибутив.
3. По пути ..\x64\acad\ лежит тот самый инсталлер, что я прилагал выше, но уже полный, со всеми файлами россыпью. Необходимо его при помощи скрипта вывести на пару msi + cab без файлов россыпью. И чтобы с этого инсталлера удалось поставить продукт.

Iska 05-04-2020 08:06 2915855

Увы, мне сейчас некуда даже вполовину меньший объём помещать :). Максимум того. над чем я могу поиграться — msi-инсталлятор от 7-Zip. Можете на его основе сделать описание того, «как должно быть»?

m0nkrus 05-04-2020 09:18 2915860

Iska, не получится. Посмотрел я 7zip-овский msi-инсталлер. Во-первых, там нет файлов россыпью - всё внутри в cab-файле в стриме. Во-вторых, все файлы имеют одинаковый формат. Этот инсталлер не соответствует техзаданию.

Но я придумал вариант с тем небольшим инсталлером, о котором писал выше, с тем, который самостоятельно не запускается, а только в составе пакета. Его оказалось можно запустить самостоятельно в режиме административной установки. Вот комплект, включая скрипт и используемый им упаковщик: https://yadi.sk/d/D9tA55UHyBKF7w

1. Упаковываем файлы россыпью в cab командой cscript WiMakCab.vbs /C /U ACAOE.msi Data1
2. Убираем из папки файлы росыпью, оставляя только ACAOE.msi, Data1.cab, ACAOE_build.xml
3. Запускаем административную установку командой msiexec.exe /a ACAOE.msi

У меня установка упирается в отсутствие файла UPICA.dll. По опыту скажу, что если пройти этот файл, то будут еще стопы на Aec32BitAppServer57.exe, Aec32BitAppServer57.tlb, UPI.dll, UpiConfig.xml. Если кинуть этот набор файлов россыпью рядом с ACAOE.msi, то инсталлер их скушает без ругани. С этим инсталлером я обычно так и поступаю. Но вот когда я работаю с acad.msi, там слишком большой объем приходится "выставлять за дверь", что делает всю работу по упаковке бессмысленной.


Время: 11:41.

Время: 11:41.
© OSzone.net 2001-