WiX 在卸载时删除 LocalAppData (AppData\Local\my_app_folder)
WiX remove LocalAppData (AppData\Local\my_app_folder) on uninstall
我有一个 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>
And I get this error:
ICE38:
Component RemoveLocalAppData installs to user profile. It must use a
registry key under HKCU as its KeyPath, not a file.
我想我没有正确使用 RemoveFolderEx,但我不知道在这种情况下清除 LocalAppData 的正确方法。
注意,我没有在安装过程中创建文件夹。相反,此 [LocalAppData]\my_application 是由应用程序在 post 安装时 运行 创建的。
在以下 link 的帮助下,最终设法删除了当前用户的 LocalAppData(缓存):https://pkisensee.wordpress.com/2015/10/06/windows-installer-removing-folders/
为了成功删除应用程序的 LocalAppData 文件夹,我必须在注册表中搜索(使用 RegistrySearch)应用程序缓存文件夹的位置并将其存储在 属性.
<Property Id="CACHEFOLDER">
<RegistrySearch Key="Software\CompanyName\AppName" Root="HKCU" Type="raw"
Id="CacheFolderRegSearch" Name="CachePath" />
</Property>
但是,目前此注册表项不存在,因此无法解析路径。因此在安装过程中,我必须在注册表中保存 LocalAppData 缓存文件夹的位置,以便在卸载时,我可以执行 RegistrySearch 并通过 [=25= 递归删除缓存文件夹]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>
Note that this is done within the TARGETDIR directory
最后,需要将该组件注册到 Feature
<Feature Id="MainApplication" Title="App Name" Level="1">
<!-- Other Components -->
<ComponentRef Id="CacheCleanup" />
</Feature>
我有一个 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>
And I get this error:
ICE38: Component RemoveLocalAppData installs to user profile. It must use a registry key under HKCU as its KeyPath, not a file.
我想我没有正确使用 RemoveFolderEx,但我不知道在这种情况下清除 LocalAppData 的正确方法。
注意,我没有在安装过程中创建文件夹。相反,此 [LocalAppData]\my_application 是由应用程序在 post 安装时 运行 创建的。
在以下 link 的帮助下,最终设法删除了当前用户的 LocalAppData(缓存):https://pkisensee.wordpress.com/2015/10/06/windows-installer-removing-folders/
为了成功删除应用程序的 LocalAppData 文件夹,我必须在注册表中搜索(使用 RegistrySearch)应用程序缓存文件夹的位置并将其存储在 属性.
<Property Id="CACHEFOLDER">
<RegistrySearch Key="Software\CompanyName\AppName" Root="HKCU" Type="raw"
Id="CacheFolderRegSearch" Name="CachePath" />
</Property>
但是,目前此注册表项不存在,因此无法解析路径。因此在安装过程中,我必须在注册表中保存 LocalAppData 缓存文件夹的位置,以便在卸载时,我可以执行 RegistrySearch 并通过 [=25= 递归删除缓存文件夹]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>
Note that this is done within the TARGETDIR directory
最后,需要将该组件注册到 Feature
<Feature Id="MainApplication" Title="App Name" Level="1">
<!-- Other Components -->
<ComponentRef Id="CacheCleanup" />
</Feature>