Вы можете использовать объект com установщика Windows для перечисления исправлений.
Прочтите эту статью. Он не делает именно то, что вам нужно, но предоставляет файл comObject.types.ps1xml, который вам понадобится:
http://www.snowland.se/2010/02/21/read-msi-information-with-powershell/
Затем вы можете сделать это, чтобы получить патч:
$installer_obj = New-Object -com WindowsInstaller.Installer;
$patches = $installer_obj.InvokeParamProperty("PatchesEx", "Product-Code-GUID", "s-1-1-0", 7, 15);
Product-Code-GUID — это GUID интересующего вас продукта. Я также предпочитаю перечислять список продуктов и программно получать GUID на основе удобочитаемого имени (т. е. того, которое отображается в «Установке и удалении программ»). ).
$installer_obj = New-Object -com WindowsInstaller.Installer;
$all_products = $installer_obj.GetProperty("Products");
foreach($product_code in $all_products) {
$product_name = $installer_obj.InvokeParamProperty("ProductInfo", $product_code, "ProductName")
if($product_name -eq "MySQL Server 5.1") {
$interesting_product_code = $product_code;
}
}
$patches = $installer_obj.InvokeParamProperty("PatchesEx", $interesting_product_code, "s-1-1-0", 7, 15);
Какой бы маршрут вы ни выбрали, теперь вам просто нужно перебрать $patches и вызвать msiexec из командной строки с соответствующими аргументами (если вы решите использовать литеральную строку для $interesting_product_code, просто замените переменную и конкатенацию литералом строка GUID.):
foreach($patch in $patches) {
$patch_code = $patch.GetProperty("PatchCode");
$argument_list = "/I" + $interesting_product_code + " MSIPATCHREMOVE=$patch_code /qb /norestart";
Start-Process -FilePath "msiexec.exe" -ArgumentList $argument_list -Wait;
}
Вот ссылка на объект com установщика Windows. С ним можно делать и другие забавные вещи:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa369432%28v=vs.85%29.aspx
Надеюсь, это поможет, Аарон
person
Aaron Ray
schedule
04.04.2012