2

我有这个属性:

<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 个产品实例:

C:\Users\[CurrentUser]\AppData\Local\Company\Product C:\Users\[CurrentUser]\AppData\Local\Company\Product2

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

我曾尝试使用注册表搜索(因为我将 的值保存INSTALLFOLDER在注册表中),但它不起作用。

4

1 回答 1

3

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


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

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

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

对于 INSTALLFOLDER 属性,您只需要添加两件事,一个注册表搜索和一个注册表项。

首先,我们需要添加一个带有注册表项的新组件,以将 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,您可以只在注册表路径中输入静态文本而不是“[Manufacturer]”和“[ProductName]”。

于 2016-04-29T14:32:55.000 回答