|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Перепаковка MSI при помощи WiMakCab.vbs |
|
|
VBS/WSH/JS - Перепаковка MSI при помощи WiMakCab.vbs
|
Старожил Сообщения: 148 |
Есть такой стандартный скрипт 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 Для тестирования прикладываю сам скрипт и один из msi-инсталлеров, с которым у меня проблемы: https://yadi.sk/d/sqR4R5DXyGEYxQ Остальные установочные файлы не нужны. Чтобы создать ddf-файл запустите команду cscript WiMakCab.vbs acad.msi Data1 |
|
Отправлено: 10:47, 02-04-2020 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать m0nkrus, попроще бы. И пошагово.
|
Отправлено: 22:26, 02-04-2020 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 148
|
Профиль | Сайт | Отправить PM | Цитировать Iska, куда уж проще? Тут шаг всего один! При запуске команды cscript WiMakCab.vbs acad.msi Data1 создается файл Data1.DDF в котором в определенном формате (текстовик) должна быть перечислены инфа о всех файлах, устанавливаемых msi-инсталлером. В данном конкретном случае инфа дается о 2456 файлах. Только вот должна быть информация о 3329 файлах. Вот эта почти тысяча выпавших файлов впоследствии не будет упакована в cab-архив. Смысл перепаковки теряется.
|
Отправлено: 22:48, 02-04-2020 | #3 |
fascinating rhythm Сообщения: 6619
|
Профиль | Отправить PM | Цитировать Судя по всему, если именование файлов различное, то берётся только один формат.
Я для перепаковки пользовался Wix toolset. |
------- Отправлено: 09:38, 03-04-2020 | #4 |
Старожил Сообщения: 148
|
Профиль | Сайт | Отправить PM | Цитировать Цитата DJ Mogarych:
Задача в том, чтобы не озвучить очевидное, а решить проблему как-то, если это возможно, подправив код скрипта. Цитата DJ Mogarych:
|
|||
Отправлено: 10:29, 03-04-2020 | #5 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать 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 которых содержатся значения 8192 или 8704, в выдачу не попадут. |
Отправлено: 19:00, 03-04-2020 | #6 |
Старожил Сообщения: 148
|
Профиль | Сайт | Отправить PM | Цитировать Iska, я, ксожалению, в языке VBS не в зуб ногой. Это как-то можно исправить?
В выдачу не попадают файлы, типа тех, что во втором блоке в кода в шапке. |
Отправлено: 19:44, 03-04-2020 | #7 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать m0nkrus, я бы исправил, если бы знал, что нужно исправлять и что нужно исправлять. И до́́лжно ли исправлять что-то. Вот в чём дело.
Если достаточно будет того, чтобы списки всех безусловно помещались в в файл .ddf — просто закомментируйте само условие апострофами: |
Отправлено: 22:16, 03-04-2020 | #8 |
Старожил Сообщения: 148
|
Профиль | Сайт | Отправить PM | Цитировать 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 без файлов россыпью. И чтобы с этого инсталлера удалось поставить продукт. |
Последний раз редактировалось m0nkrus, 03-04-2020 в 23:31. Отправлено: 23:22, 03-04-2020 | #9 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Увы, мне сейчас некуда даже вполовину меньший объём помещать
![]() |
Отправлено: 08:06, 05-04-2020 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
7 / 2008 R2 - Перепаковка WinSXS и удаление кеша драйверов при подготовке усановочного диска | Rupinskiy | Автоматическая установка Windows 11 / 10 / 8 / 7 / Vista | 2 | 12-04-2015 23:05 | |
VBS/WSH/JS - Прошу помощи в VBS | Destany | Скриптовые языки администрирования Windows | 3 | 06-06-2013 13:20 | |
2008 R2 - Отказ в доступе к шаре при запуске скрипта при помощи ГП | SANIOK_AV | Windows Server 2008/2008 R2 | 3 | 11-10-2012 20:26 | |
7 / 2008 R2 - [решено] Ошибка при удалении ненужных компонентов при помощи DISM | ruslanhamidov80 | Автоматическая установка Windows 11 / 10 / 8 / 7 / Vista | 4 | 10-10-2011 15:24 | |
VBS/WSH/JS - Помогите редактировать Autorun_Disable.vbs на Autorun_Enable.vbs | nod201 | Скриптовые языки администрирования Windows | 0 | 05-12-2009 05:44 |
|