【问题标题】:WiX remove LocalAppData (AppData\Local\my_app_folder) on uninstallWiX 在卸载时删除 LocalAppData (AppData\Local\my_app_folder)
【发布时间】:2017-11-09 07:07:07
【问题描述】:

我有一个 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。更具体地说,Users\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>

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

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

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

【问题讨论】:

标签: wix local uninstallation appdata


【解决方案1】:

在以下链接的帮助下,终于设法删除了当前用户的 LocalAppData(cache):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

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

【讨论】:

  • 请注意,在 WiX 3.11.1 中,我必须使用 [LocalAppDataFolder] 而不是 [LocalAppData]
  • 如果有人在卸载程序运行之前从外部将“CachePath”注册表值设置为“C:/”怎么办?然后卸载程序会继续删除分区上的所有文件而不发出警告吗?
  • 这是一个绝妙的问题!自从我上次从事这项工作以来已经有好几年了,所以我自己并不完全确定。可能需要有更好理解/经验的人来回答这个问题。我只能说确保应用程序的CachePath 注册表值不受修改?
猜你喜欢
  • 1970-01-01
  • 2010-09-16
  • 2011-11-23
  • 2015-10-10
  • 2011-05-08
  • 1970-01-01
  • 2018-05-14
  • 1970-01-01
  • 2014-10-16
相关资源
最近更新 更多