Я пытаюсь редактировать MSI-файлы с помощью powershell. Я могу редактировать почти каждую таблицу, но раздел «SummaryInformation» на самом деле не является таблицей так же, как остальные.
Я могу читать свойства этой информации без каких-либо проблем, но не могу ничего установить.
Из информации, которую я смог найти в Интернете, я смогу установить ее с помощью
$SummaryInfo.GetType().InvokeMember("Property", "SetProperty”, $null, $SummaryInfo,@(3,'test'))
Но когда я пытаюсь это сделать, я получаю очень странную ошибку,
Исключение, вызывающее InvokeMember с аргументом (ами) "5": "Свойство, Pid"
Эта ошибка появляется только тогда, когда я указываю массив "@ (3, 'test')" как @ (int, string) или, иначе, я получаю ошибку несоответствия типов. Это приводит меня к мысли, что я близок к правильному решению.
Любая помощь будет оценена.
Ниже приведен код, который, я думаю, должен работать.
$MSIPATH = "Path To MSI File"
$windowsInstaller = New-Object -ComObject WindowsInstaller.Installer
$MSIDatabase = $windowsInstaller.GetType().InvokeMember("OpenDatabase", "InvokeMethod", $Null, $windowsInstaller, @($MSIPATH, 1))
$SummaryInfo = $MSIDatabase.GetType().InvokeMember(“SummaryInformation”, “GetProperty”,$Null , $MSIDatabase, $Null)
#get the porperty that I want to set
$SummaryInfo.GetType().InvokeMember(“Property”, “GetProperty”, $null, $SummaryInfo, @(3))
#Attempt to set the property this fails
$SummaryInfo.GetType().InvokeMember("Property", "SetProperty”, $null, $SummaryInfo,@(3,'test'))
Благодаря mklement0 я нашел решение
Код выглядит так
$windowsInstaller = New-Object -ComObject WindowsInstaller.Installer
$MSI = $windowsInstaller.OpenDatabase("Path to MSI", 1)
$SummaryInfo = $MSI.SummaryInformation(4)
$SummaryInfo.Property(3) = "Test"
$SummaryInfo.Persist()
$MSI.Commit()
Иногда вам просто нужен кто-то, кто скажет вам, что вы глупы.