WiX在卸载

时间:2017-11-09 07:07:07

标签: wix local uninstall appdata

我有一个wix安装项目,它创建一个ProgramMenu快捷方式和一个桌面快捷方式。我可以使用 RemoveFolder 删除这些快捷方式。

<!-- To remove Desktop shortcut -->
<RemoveFolder Id="RemoveDesktopFolder" Directory="DesktopFolder" On="uninstall"/>

<!-- To remove ProgramMenu shortcut-->
<RemoveFolder Id="CleanUpShortCut" Directory="ApplicationProgramsFolder" On="uninstall" />

但是,在卸载时,我还希望能够清除当前用户的LocalAppData。更具体地说,用户\ CurrentUser \ AppData \ Local \ my_application

到目前为止,我已经发现 RemoveFolder 不会递归删除文件而我必须使用 util:RemoveFolderEx。我就是这样做的:

  <Directory Id="LocalAppDataFolder" Name="Local">
    <Directory Id="RemoveLocalData" Name="my_application">
      <Component Id="RemoveLocalAppData" Guid="PUT-GUID-HERE">
        <util:RemoveFolderEx On="uninstall" Property="RemoveLocalData"/>
        <RemoveFolder Id="RemoveLocalData" On="uninstall"/>
      </Component>
    </Directory>
  </Directory>
  

我得到了这个错误:
  ICE38:   组件RemoveLocalAppData安装到用户配置文件。它必须使用   HKCU下的注册表项作为其KeyPath,而不是文件。

我认为我没有正确使用 RemoveFolderEx ,但在这种情况下我不知道清除LocalAppData的正确方法。

注意,我不会在安装过程中创建该文件夹。相反,此[LocalAppData] \ my_application是在应用程序运行时在安装后创建的。

1 个答案:

答案 0 :(得分:1)

最后在以下链接的帮助下设法删除了当前用户的LocalAppData(缓存):https://pkisensee.wordpress.com/2015/10/06/windows-installer-removing-folders/

为了成功删除应用程序的LocalAppData文件夹,我必须在注册表中搜索(使用 RegistrySearch )获取应用程序缓存文件夹的位置并将其存储在 Property

<Property Id="CACHEFOLDER">
     <RegistrySearch Key="Software\CompanyName\AppName" Root="HKCU" Type="raw"
                     Id="CacheFolderRegSearch" Name="CachePath" />
</Property>

但是,此注册表项目不存在,并且路径无法解析。因此,在安装过程中,我必须在注册表中保存LocalAppData缓存文件夹的位置,以便在卸载时,我可以执行 RegistrySearch 并通过 util:RemoveFolderEx <递归删除缓存文件夹/强>

为此,我在组件中设置了 RegistryValue

<Directory Id="TARGETDIR" Name="SourceDir">

    <!-- ... -->

    <!-- This is the name of the cache folder in LocalAppData -->
    <!-- In this case the cache folder is in \Users\CurrentUser\AppData\Local\MyAppCache -->
    <?define AppCacheFolder = "MyAppCache" ?>
    <Component Id="CacheCleanup" Guid="*">
         <RegistryValue Root="HKCU" Key="Software\CompanyName\AppName" Name="CachePath" 
                        Type="string" Value="[LocalAppData]$(var.AppCacheFolder)"                   
                        KeyPath="yes" />
         <util:RemoveFolderEx On="uninstall" Property="CACHEFOLDER"/>
    </Component>

    <!-- ... -->

</Directory>
  

请注意,这是在 TARGETDIR 目录

中完成的

最后,需要将该组件注册到功能

<Feature Id="MainApplication" Title="App Name" Level="1">
    <!-- Other Components -->
    <ComponentRef Id="CacheCleanup" />
</Feature>