如何确定Windows Installer是在执行升级,而不是首次安装?
时间:2020-03-06 14:50:45 来源:igfitidea点击:
如果退出,我有一个升级应用程序的先前版本的安装程序。当安装为升级模式时,我想跳过某些操作。如何确定安装是在升级模式下还是在首次安装模式下运行?
我正在使用Wise Installer,但我认为这并不重要。我假设Windows Installer具有在安装程序处于升级模式时设置的属性。我只是找不到。如果该属性存在,则假定可以在条件语句中使用它。
解决方案
我不确定我是否理解问题。
如果我们自己编写安装脚本,则在Windows上,最好的方法是检查该程序通常创建的注册表项。与安装目录(和开始菜单条目等)不同,它是不变的。这些密钥之一甚至可以是软件的版本号,以检查用户是否尝试安装较旧的版本(或者了解是否必须删除某些文件等)。
我们能否详细说明我们使用哪种工具来创建此安装程序?
我使用Windows Installer XML(WIX)。在WIX中,我们可以执行以下操作:
<!-- Property definitions --> <?define SkuName = "MyCoolApp"?> <?define ProductName="My Cool Application"?> <?define Manufacturer="Acme Inc."?> <?define Copyright="Copyright ? Acme Inc. All rights reserved."?> <?define ProductVersion="1.1.0.0"?> <?define RTMProductVersion="1.0.0.0" ?> <?define UpgradeCode="{EF9D543D-9BDA-47F9-A6B4-D1845A2EBD49}"?> <?define ProductCode="{27EA5747-9CE3-3F83-96C3-B2F5212CD1A6}"?> <?define Language="1033"?> <?define CodePage="1252"?> <?define InstallerVersion="200"?>
并定义升级选项:
<Upgrade Id="$(var.UpgradeCode)"> <UpgradeVersion Minimum="$(var.ProductVersion)" IncludeMinimum="no" OnlyDetect="yes" Language="$(var.Language)" Property="NEWPRODUCTFOUND" /> <UpgradeVersion Minimum="$(var.RTMProductVersion)" IncludeMinimum="yes" Maximum="$(var.ProductVersion)" IgnoreRemoveFailure="no" IncludeMaximum="no" Language="$(var.Language)" Property="OLDIEFOUND" /> </Upgrade>
然后,根据我们要执行的操作,我们可以使用OLDIEFOUND和NEWPRODUCTFOUND属性:
<!-- Define custom actions --> <CustomAction Id="ActivateProduct" Directory='MyCoolAppFolder' ExeCommand='"[MyCoolAppFolder]activateme.exe"' Return='asyncNoWait' Execute='deferred'/> <CustomAction Id="NoUpgrade4U" Error="A newer version of MyCoolApp is already installed."/>
以上定义的动作必须在InstallExcecuteSequence
中定义
<InstallExecuteSequence> <Custom Action="NoUpgrade4U" After="FindRelatedProducts">NEWPRODUCTFOUND</Custom> <Custom Action="ActivateProduct" OnExit='success'>NOT OLDIEFOUND</Custom> </InstallExecuteSequence>
有一个名为Installed的MSI属性,如果该产品是按计算机或者当前用户安装的,则为true。我们可以在条件布尔语句中使用它。
我们还可以检查其他MSI安装状态属性,以防它们之一更好用。我从未使用过Wise,但我认为有一种方法可以检索这些属性。