Wix修复安装在默认路径中,而不是安装应用程序的位置

时间:2016-04-29 06:22:38

标签: wix windows-installer repair installation-path

我有这个属性:

<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER"/>

我的目录:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="LocalAppDataFolder">
    <Directory Id="LocalAppDataCompany" Name="Company">
      <Directory Id="INSTALLFOLDER" Name="Product" />
    </Directory>
  </Directory>
</Directory>

它成功编译。当我运行.msi时,它会按预期在C:\Users\[CurrentUser]\AppData\Local\Company\Product中安装文件。

但问题是:

  1. 我运行安装程序并更改路径(让我们说在对话框中,我将路径更改为Product2
  2. 产品已成功安装在...\AppData\Local\Company\Product2
  3. 我再次运行安装程序,然后选择修复
  4. 现在我有2个产品实例:
  5. C:\Users\[CurrentUser]\AppData\Local\Company\Product C:\Users\[CurrentUser]\AppData\Local\Company\Product2

    如何在...\AppData\Local\Company\Product2(或最初安装应用程序的任何地方)修复修复,重新安装文件(修复期间)?

    我尝试过使用注册表搜索(因为我在注册表中保存了INSTALLFOLDER的值),但它无效。

1 个答案:

答案 0 :(得分:1)

编辑:哇,我真的需要在回答之前阅读完整的问题。刚刚注意到您将此值存储在注册表中。我仍然会保留我的答案,因为它可能有用。

您需要实现一个记住我的模式,以便您的安装可以获取在初始安装期间可能已修改的属性。安装目录可能是您应该记住的最频繁修改的属性。有很多安装程序没有正确执行此操作,您会注意到如果要进行升级,它们始终默认为默认安装目录,而不是之前安装的地方,这可能很烦人。

This很好地解释了“记住我”模式的概念。在大多数情况下,您可以轻松实现简单的实现。

要点是您需要存储更改后的安装目录的值(通常在注册表中),然后在每次运行安装程序时尝试将其取出。

对于INSTALLFOLDER属性,您只想添加两项内容,即注册表搜索和注册表项。

首先,我们需要添加一个带有registrykey的新组件,以将INSTALLFOLDER的值写入注册表

<Component Id="InstallFolderRegistry" Directory='INSTALLFOLDER'>
  <RegistryValue Root='HKCU' Key='SOFTWARE\[Manufacturer]\[ProductName]'
                 Name='InstallFolder' Value='[INSTALLFOLDER]'
                 Type='string' KeyPath="yes" />    
</Component>

如果您只想删除“KeyPath =”yes“”,您也可以将此注册表值存储到另一个组件中。

这将在安装期间将INSTALLFOLDER属性的值放在注册表中。

现在我们需要尝试读取此值(如果它在启动时存在),以便在升级或修复期间我们将获得用户选择安装的正确位置。

<Property Id='INSTALLFOLDER'>
  <RegistrySearch Id='InstallFolderRegSearch' Root='HKCU'
                  Key='SOFTWARE\[Manufacturer]\[ProductName]'
                  Name='InstallFolder' Type='raw' />
</Property>

现在,当您修复安装程序时,应找到此注册表项,然后修复正确的目录。此外,在升级过程中,安装位置将设置为与当前安装的产品相同的位置。

要注意,如果您有非静态ProductName或制造商,则可以在注册表路径中输入静态文本而不是“[Manufacturer]”和“[ProductName]”。