如何确定Windows Installer是否正在执行升级而不是首次安装?

时间:2008-09-28 14:05:29

标签: installer installation windows-installer

我有一个安装程序可以升级以前版本的应用程序。我想在安装升级模式时跳过某些操作。如何确定安装是否在升级模式下运行,而不是首次安装模式?

我正在使用Wise Installer,但我认为这不重要。我假设Windows Installer具有在安装程序处于升级模式时设置的属性。我似乎无法找到它。如果属性存在,我假设我可以在条件语句中使用它。

3 个答案:

答案 0 :(得分:2)

您能详细说明您使用哪种工具来创建此安装程序吗?

我使用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>

然后,您可以使用OLDIEFOUNDNEWPRODUCTFOUND属性,具体取决于您要执行的操作:

<!-- 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>

答案 1 :(得分:1)

如果产品是按计算机安装的,或者是针对当前用户,则会有一个名为Installed的MSI属性为true。您可以在条件布尔语句中使用它。

您还可以检查这些其他MSI安装状态properties,以防其中一个更好用。我从未使用过Wise,但我认为有一种方法可以检索这些属性。

答案 2 :(得分:-1)

我不确定我理解你的问题 如果您自己编写安装脚本,在Windows上最好的方法是检查程序通常创建的注册表项。与安装目录(和开始菜单条目等)不同,它是一个不变量。其中一个密钥甚至可以是软件的版本号,用于检查用户是否尝试安装旧版本(或者知道是否必须删除某些文件等)。