Wix安装程序TARGETDIR INSTALLDIR设置为E:\

Wix安装程序TARGETDIR INSTALLDIR设置为E:\,wix,Wix,我正在努力与Wix安装程序。在安装过程中,INSTALLDIR被覆盖到自定义文件夹(不在程序文件中)。当我卸载时,INSTALLDIR和TARGETDIR被设置为E:\无论我做什么 我该如何解决这个问题?以下是相关片段: <Property Id="ARPINSTALLLOCATION"> <RegistrySearch Id="GetINSTALLDIRFromRegistry" Root="HKLM" Key="Software\Microsof

我正在努力与Wix安装程序。在安装过程中,INSTALLDIR被覆盖到自定义文件夹(不在程序文件中)。当我卸载时,INSTALLDIR和TARGETDIR被设置为E:\无论我做什么

我该如何解决这个问题?以下是相关片段:

    <Property Id="ARPINSTALLLOCATION">
        <RegistrySearch Id="GetINSTALLDIRFromRegistry" Root="HKLM"
  Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductCode]" Name="InstallLocation" Type="raw" />
    </Property>

    <SetDirectory Id="TARGETDIR" Value="[ARPINSTALLLOCATION]">Installed</SetDirectory>

    <SetProperty Id="ARPINSTALLLOCATION" Value="[INSTALLDIR]" After="CreateFolders" Sequence="execute">NOT Installed</SetProperty>



  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="INSTALLDIR" Name="WinApp">
            </Directory>
    </Directory>
  </Fragment>

安装
未安装
提前谢谢。我正在使用Wix工具3.10

更新1

以下是我的发现(目前。请纠正我,因为我对Wix还是新手)

  • 与普遍的看法相反,安装程序似乎不会在卸载过程中自动设置安装文件夹
  • 上述规则的一个重要例外是,安装文件夹是“众所周知”的文件夹,如ProgramFilesFolder
因此,如果将目录结构设置为:

<Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="INSTALLDIR">
                <Directory Id="TEST" Name="WinApp" />
            </Directory>
    </Directory>
  </Fragment>

必须通过属性分配或自定义操作设置INSTALLDIR目录。例如:

<Property Id="INSTALLDIR"><![CDATA[C:\mydir1\mydir1]]></Property>

如果通过对话框动态设置INSTALLDIR,则必须从注册表或文件(安装期间存储该文件的位置)读取它

更新2

略加改进的版本

<SetProperty Id="ARPINSTALLLOCATION" Value="[INSTALLDIR]" Sequence="execute" After="InstallFiles" />

        <Property Id="INSTALLDIR" Secure="yes">
            <RegistrySearch Id="Locate_EXISTINGINSTALLDIR" Root="HKLM" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductCode]" Name="InstallLocation" Type="directory" />
        </Property>


        <CustomAction Id="SetTARGETDIR"
                                    Directory="TARGETDIR"
                                    Value="[INSTALLDIR]"
                                    Return="check" />


        <InstallExecuteSequence>
            <!--this action launches a window to allow the user to choose the folder. don't want 
                    to use standard MSI/Wix dialogs as the functionality is limited
            -->
            <Custom Action='SelectFolderCustomAction' Before='CreateFolders'>NOT Installed</Custom>
            <!--<Custom Action='RegistrationInfoCustomAction' Before='InstallFinalize'>NOT Installed</Custom>-->
            <!--<Custom Action='UninstallCustomAction' Before='RemoveFiles'>Installed AND REMOVE = "ALL"</Custom>-->
            <Custom Action="SetTARGETDIR" Before="RemoveFiles">Installed AND REMOVE = "ALL"</Custom>
        </InstallExecuteSequence>

未安装
已安装并删除=“全部”

删除
SetDirectory
元素,它已过时。当产品已安装时,Windows Installer会自动将目录属性设置为实际安装目录的路径

arpsinstalllocation
RegistrySearch
看起来也很奇怪。通常,此属性只应在首次安装期间设置,您已经使用
SetProperty
元素进行了设置

因此,以下几点就足够了:

<SetProperty Id="ARPINSTALLLOCATION" Value="[INSTALLDIR]" After="CreateFolders" Sequence="execute">NOT Installed</SetProperty>

<Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
        <Directory Id="INSTALLDIR" Name="WinApp"/>
    </Directory>
</Fragment>
未安装

我不明白上面你想做什么。为什么要从注册表中读取安装位置

这是我安装到“D:\Program Files”文件夹的步骤



Windows Installer自动设置目录属性==>我就是这么想的。根据您的回答,我删除了注册表内容,但它没有从INSTALL位置卸载文件夹及其内容。我打开了日志记录,您可以看到结果:MSI(c)(6C:80)[14:35:52:803]:属性更改:添加TARGETDIR属性。其值为“E:\”。MSI(c)(6C:80)[14:35:52:803]:属性更改:添加INSTALLDIR属性。它的值为“E:\”。@user34332然后在第一次安装期间未正确设置
INSTALLDIR
propably。您可以将设置
INSTALLDIR
的代码添加到您的帖子中吗?安装目录是在自定义操作中设置的。用户选择文件夹。在自定义操作session.SetTargetPath(“INSTALLDIR”、“c:\\company\\product”)中,它是这样设置的。如果我在片段中将它设置为一个众所周知的目录,比如ProgramFiles,它就可以正常工作。这只是用于卸载。对于安装,他们从自定义对话框中选择它。我漏掉了那个密码。如果我不读它,它就会被设置为E:\。
<Property Id="ROOTDRIVE"><![CDATA[D:\]]></Property>
<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFiles" Name="Program Files">