我有这个属性:
<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
中安装文件。
但问题是:
Product2
...\AppData\Local\Company\Product2
C:\Users\[CurrentUser]\AppData\Local\Company\Product
C:\Users\[CurrentUser]\AppData\Local\Company\Product2
如何在...\AppData\Local\Company\Product2
(或最初安装应用程序的任何地方)修复修复,重新安装文件(修复期间)?
我尝试过使用注册表搜索(因为我在注册表中保存了INSTALLFOLDER
的值),但它无效。
答案 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]”。