2

在从版本 X 到版本 Y 的重大升级期间,我需要一个属性/变量来说明版本 X 正在升级。

当使用由 WiX Installer 构建的设置对产品进行重大升级时,有没有办法获得正在升级的版本号?

4

2 回答 2

3

假设您使用的是 WiX majorupgrade 元素,当检测到升级时,WIX_UPGRADE_DETECTED 属性的值将设置为正在升级的产品的产品代码。您可以将其传递给 C++ Win32 API MsiGetProductInfo (.... INSTALLPROPERTY_VERSIONSTRING...) 以获取版本字符串。我认为有一个等效的 DTF ProductInstallation 类,您可以使用该产品代码构建然后获取版本。如果您没有使用majorupgrade 元素,那么仍然有一个类似PREVIOUSVERSIONSINSTALLED 的属性将设置为产品代码,因此这取决于您如何设置它。请注意,严格来说,您可能要升级多个产品。这将在 FindRelatedProducts 之后完成。无论如何,这就是我要看的。

我认为没有内置的方式来获取版本。您需要知道升级实际上首先会起作用,因此您需要由 FindRelatedProducts 升级搜索设置的属性。您还可以做其他事情,但我不知道它们是否适用于您的情况。例如,如果您从外部程序启动 MSI,它可以枚举相关产品到 MSI 的产品代码,获取版本并将其作为属性传递到命令行以减少 MSI 需要做的事情,假设升级正在进行工作,但这在你的情况下可能没用。

于 2014-06-26T17:02:21.843 回答
1

我从未尝试过,但您也许可以使用UPGRADINGPRODUCTCODE 属性来检索正在卸载的产品的产品代码。据我所知,它被设置为升级表标识为“要删除”的产品代码列表(可能有几个产品要卸载)。

然后,您可以使用简单的VBScript检索系统上该产品代码的版本。下面的脚本有一个硬编码的产品代码,用于查找Windows Movie Maker。使用您自己的产品 G​​UID 进行更新。它还具有一个被调用的 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
于 2014-06-27T06:27:20.153 回答