Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wix修复安装在默认路径中,而不是安装应用程序的位置_Wix_Windows Installer_Repair_Installation Path - Fatal编程技术网

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

Wix修复安装在默认路径中,而不是安装应用程序的位置,wix,windows-installer,repair,installation-path,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"> <Direc

我有这个财产:

<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
  • 我再次运行安装程序,并选择了repair
  • 现在我有两个产品实例:
  • C:\Users\[CurrentUser]\AppData\Local\Company\Product
    C:\Users\[CurrentUser]\AppData\Local\Company\Product2

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


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

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


    您需要实现“记住我”模式,以便您的安装可以拾取在初始安装期间可能已修改的属性。install dir可能是您应该记住的最频繁修改的属性。有许多安装程序没有正确执行此操作,您会注意到,如果您正在升级,它们总是会被删除默认安装目录的错误不在您以前安装的位置,这可能会很烦人

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

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

    对于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>
    
    
    
    现在,修复时,安装程序应找到此注册表项,然后修复正确的目录。此外,在升级期间,安装位置将设置为与当前安装的产品相同的位置


    请注意,如果您有一个非静态的产品名称或制造商,则只需输入静态文本,而不是“[Manufacturer]”和“[ProductName]”在注册表路径中。

    您可以共享问题中的RegistrySearch和RegistryValue组件吗?这是一种方法,这样我就可以怀疑某些内容编写错误。感谢您的回答。我会尝试一下,使用注册表执行“记住我”模式时可能遗漏了一些内容:)