如何找出安装的产品 - 已经安装了更新的产品MSI窗口

时间:2015-03-10 11:56:03

标签: wix windows-installer failed-installation

我可以通过WIX创建MSI - >我们在IIS上安装它。发生了什么 - 我们已经安装了一些版本的应用程序,比如1.8,然后我们安装版本让我们说99.0仅用于测试目的,然后我们卸载了这个99版本。然后我尝试安装其他版本并获得:已经安装了该产品的更新版本。

然后我尝试跟随更改产品的升级代码 - 再次制作高版本,然后卸载并安装较低版本 - 它工作正常。

所以我觉得我错过了一些东西 - 附加信息是在程序和功能列表中我在卸载后找不到更高的应用程序 - 那么我的问题是安装程序如何评估有更新的版本?关于存储的内容(以及用于比较)的确切信息,以及如何有效和轻松地访问它们?所以我可以直视它?

1 个答案:

答案 0 :(得分:4)

ProductCode标识特定产品。每次发运新的替换产品时它都会发生变化。 UpgradeCode通过在更新的产品中使用相同的UpgradeCode来定义一系列产品,这些产品的版本预计会不断增加。默认情况下,新产品版本会通过主要升级替换旧版产品。由于upgradecode定义了产品系列,因此Windows将查找具有相同UpgradeCode的产品,因为相同的UpgradeCodes意味着相互独立的产品,使用它们将旧产品替换为新产品。在WiX中,使用您可能正在使用的majorupgrade元素进行主要升级,因为您得到“已安装较新版本”消息。如果要“升级”到较低版本,则会有一个AllowDowngrade选项。

产品版本(如文件版本)不仅仅是有用的信息 - 它们被系统使用,并且理解新的替换旧版本,并且返回较低版本通常是一件坏事,这就是默认行为不允许降级的原因。

此脚本可能有所帮助。它使用Windows Installer脚本API枚举所有已安装的产品,显示版本,用户sid,ProductCode等:

Option Explicit
Public installer, fullmsg, comp, prod, a, fso, pname, ploc, pid,contxt, sid, psorce, pcache, pvers

Set fso = CreateObject("Scripting.FileSystemObject")
Set a = fso.CreateTextFile("prodex.txt", True)

' Connect to Windows Installer object
Set installer = CreateObject("WindowsInstaller.Installer")
a.writeline ("Products")
'on error resume next
For Each prod In installer.ProductsEx("", "", 7)
   pid = prod.ProductCode
   contxt = prod.Context
   sid=prod.usersid
   pname = prod.InstallProperty("ProductName")
   psorce = prod.InstallProperty("InstallSource")
   ploc =prod.InstallProperty("InstallLocation")  
   pcache = prod.InstallProperty("LocalPackage") 
   pvers=prod.InstallProperty("VersionString")
   a.writeline (pid & " " & pname & " " & pvers & " installed at <" & ploc & "> from " & psorce & " Context " & contxt & " Local " & pcache)
Next