在从版本X到版本Y的主要升级期间,我需要有一个属性/变量,说明版本X正在升级。
使用WiX Installer构建的设置执行产品的重大升级时,有没有办法让版本号升级?
答案 0 :(得分:2)
假设您正在使用WiX majorupgrade元素,当检测到升级时,WIX_UPGRADE_DETECTED属性的值将设置为要升级的产品的productcode。您可以将其传递到C ++ Win32 API MsiGetProductInfo(.... INSTALLPROPERTY_VERSIONSTRING ...)以获取版本字符串。我认为有一个DTF等效的ProductInstallation类,您使用该产品代码构建,然后获取版本。如果你没有使用majorupgrade元素,那么仍然会有一个像PREVIOUSVERSIONSINSTALLED这样的属性设置为productcode,所以它取决于你如何设置它。请注意,严格来说,您可以升级多个产品。这将在FindRelatedProducts之后完成。无论如何,这就是我所看到的。
我认为没有内置的方式来获取该版本。您需要知道升级实际上是先工作,所以您需要FindRelatedProducts升级搜索设置的属性。还有其他一些你可以做的事情,但我不知道他们是否适合你的情况。例如,如果您从外部程序启动MSI,它可以枚举相关产品到MSI的产品代码,获取版本并将其作为属性传递给命令行,以减少MSI需要做的事情,假设升级将会起作用,但在您的情况下这可能毫无用处。
答案 1 :(得分:0)
我从未尝试过,但您可以使用UPGRADINGPRODUCTCODE property检索要卸载的产品的产品代码。据我所知,它被设置为Upgrade table标识为“要删除”的产品代码列表(可能有几个要卸载的产品)。
然后,您可以使用简单的 VBScript 来检索系统上该产品代码的版本。下面的脚本有一个硬编码的产品代码,可以找到 Windows Movie Maker 。使用您自己的产品GUID进行更新。它还具有调用的Main函数。这是为了使脚本能够以交互方式运行,并通过MSI内的方法调用运行。该脚本需要一些时间才能完成:
Call Main
Sub Main
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & _
"{impersonationLevel=impersonate}!\\" & _
strComputer & _
"\root\cimv2")
' Select all product details for software matching input GUID
Set colSoftware = objWMIService.ExecQuery _
("SELECT * FROM Win32_Product WHERE IdentifyingNumber=" & _
"'" & "{B862B671-59FD-7457-AFA0-C738FB7ABD60}" & "'")
' For completeness allow multiple results, enumerate
If colSoftware.Count > 0 Then
For Each objSoftware in colSoftware
MsgBox "Product Name: " & objSoftware.Name & vbCrLf & _
"Product Code: " & objSoftware.IdentifyingNumber & vbCrLf & _
"Package Code: " & objSoftware.PackageCode & vbCrLf & _
"Local Package: " & objSoftware.LocalPackage & vbCrLf & _
"Version: " & objSoftware.Version, vbInformation, _
"Product Info"
Next
Else
MsgBox "No product found."
End If
End Sub