Установить SummaryInformation в MSI, используя Powershell - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь редактировать 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()

Иногда вам просто нужен кто-то, кто скажет вам, что вы глупы.

1 Ответ

0 голосов
/ 08 ноября 2018

Благодаря 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()

РЕДАКТИРОВАТЬ: исправить грамматику

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...