Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Перепаковка MSI при помощи WiMakCab.vbs

Ответить
Настройки темы
VBS/WSH/JS - Перепаковка MSI при помощи WiMakCab.vbs

Аватара для m0nkrus

Старожил


Сообщения: 148
Благодарности: 15

Профиль | Сайт | Отправить PM | Цитировать


Есть такой стандартный скрипт 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

Отправлено: 10:47, 02-04-2020

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

Отправлено: 22:26, 02-04-2020 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для m0nkrus

Старожил


Сообщения: 148
Благодарности: 15

Профиль | Сайт | Отправить PM | Цитировать


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

Отправлено: 22:48, 02-04-2020 | #3


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


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

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 09:38, 03-04-2020 | #4


Аватара для m0nkrus

Старожил


Сообщения: 148
Благодарности: 15

Профиль | Сайт | Отправить PM | Цитировать


Цитата DJ Mogarych:
Судя по всему, если именование файлов различное, то берётся только один формат. »
Гениальная мысль! Как же я до нее сам не дошел?!
Задача в том, чтобы не озвучить очевидное, а решить проблему как-то, если это возможно, подправив код скрипта.
Цитата DJ Mogarych:
Я для перепаковки пользовался Wix toolset. »
И как им пользоваться? Скачал. Установил. В меню Пуск в папке WiX Toolset v3.11 ссылки только на мануалы. Какого-либо исполняемого файла нет.

Отправлено: 10:29, 03-04-2020 | #5


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить 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 содержит значение с не установленным семнадцатым битом (0x2000).

Т.е., вот это:
Код: Выделить весь код
Const msidbFileAttributesNoncompressed = &h00002000
и вот это:
Код: Выделить весь код
If (attributes And msidbFileAttributesNoncompressed) = 0 Then
    …
End If
приводит к тому, что все файлы, в поле Attributes которых содержатся значения 8192 или 8704, в выдачу не попадут.
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:00, 03-04-2020 | #6


Аватара для m0nkrus

Старожил


Сообщения: 148
Благодарности: 15

Профиль | Сайт | Отправить PM | Цитировать


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

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

Отправлено: 19:44, 03-04-2020 | #7


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

Если достаточно будет того, чтобы списки всех безусловно помещались в в файл .ddf — просто закомментируйте само условие апострофами:
Код: Выделить весь код
	' If (attributes And msidbFileAttributesNoncompressed) = 0 Then
		…
	' End If
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:16, 03-04-2020 | #8


Аватара для m0nkrus

Старожил


Сообщения: 148
Благодарности: 15

Профиль | Сайт | Отправить 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
Благодарности: 8086

Профиль | Отправить PM | Цитировать


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

Отправлено: 08:06, 05-04-2020 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Перепаковка MSI при помощи WiMakCab.vbs

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход