如何在安装和卸载时使用 RemoveFolderEx 递归删除 LocalAppData 中的文件夹

Posted

技术标签:

【中文标题】如何在安装和卸载时使用 RemoveFolderEx 递归删除 LocalAppData 中的文件夹【英文标题】:How to use RemoveFolderEx to recursively remove folder in LocalAppData on install AND uninstall 【发布时间】:2017-11-23 00:08:27 【问题描述】:

这是我所拥有的(基于我从其他几篇 Stack Overflow 帖子和其他地方收集到的信息:

<Property Id="CACHEFOLDER">
  <RegistrySearch Key="SOFTWARE\SIL\Transcelerator" Root="HKCU" Type="raw"
    Id="CacheFolderRegSearch" Name="CachePath" />
</Property>

<Directory Id="TARGETDIR" Name="SourceDir
  <!-- Transcelerator's cache folder in LocalAppData: -->
  <!-- C:\Users\<current user>\AppData\Local\SIL\Transcelerator -->
  <!-- This needs to be saved to a registry key so it can be cleaned up on uninstall and also purged when there is a new install in order to ensure that reparsing occurs. -->
  <?define AppCacheFolder = "SIL\Transcelerator" ?>
  <Component Id="CacheCleanup" Guid="6A45D61D-EA73-4A8C-8941-B49A881ABB49">
    <RegistryValue Root="HKCU" Key="Software\SIL\Transcelerator" Name="CachePath" 
                   Type="string" Value="[LocalAppData]$(var.AppCacheFolder)"                   
                   KeyPath="yes" />
    <util:RemoveFolderEx On="both" Property="CACHEFOLDER"/>
  </Component>

</Directory>

<Feature Id="MainApplication" Title="App Name" Level="1" Absent="disallow" Display="expand" AllowAdvertise="no" InstallDefault="local">
  <ComponentRef Id="CacheCleanup" />
</Feature>

注意:最终,我想隐藏 MainApplication 功能,但现在看到它很舒服。

以下是我认为 WIX 日志文件的相关摘录:

AppSearch:属性:CACHEFOLDER,签名:CacheFolderRegSearch MSI (c) (38:F0) [18:25:39:116]:属性更改:添加 CACHEFOLDER 属性。其值为“SIL\Transcelerator”。 行动于 18:25:39 结束:AppSearch。返回值 1。

...

MSI (c) (38:F0) [18:25:45:594]:切换到服务器:PARATEEXT7="C:\Program Files (x86)\Paratext 7\" PARATEEXT7TEST="C:\Program Files (x86)\ParatextDir7Test\" PARATEEXT8="C:\Program Files (x86)\Paratext 8\" PARATEEXT8TEST="C:\Program Files (x86)\ParatextDir8Test\" PARATEEXT75100ORGREATER="C:\Program Files (x86)\ Paratext 7\Paratext.exe" CACHEFOLDER="SIL\Transcelerator" TARGETDIR="C:\" INSTALLDIR7="C:\Program Files (x86)\Paratext 7\plugins\Transcelerator\" INSTALLDIR7TEST="C:\Program Files ( x86)\ParatextDir7Test\plugins\Transcelerator\" INSTALLDIR8="C:\Program Files (x86)\Paratext 8\plugins\Transcelerator\" INSTALLDIR8TEST="C:\Program Files (x86)\ParatextDir8Test\plugins\Transcelerator\" PLUGINDIR7 ="C:\Program Files (x86)\Paratext 7\plugins\" PLUGINDIR7TEST="C:\Program Files (x86)\ParatextDir7Test\plugins\" PLUGINDIR8="C:\Program Files (x86)\Paratext 8\plugins \" PLUGINDIR8TEST="C:\Program Files (x86)\ParatextDir8Test\plugins\" CURRENTDIRECTORY="C:\Projects\Transcelerator" CLIENTUILEVEL="0" CLIENTPROCESSID="17976" SOURCEDIR="C:\Projects\Transcelerator\output\installer\" ACTION="INSTALL" EXE

...

MSI (s) (E4:44) [18:25:46:006]:属性更改:添加 CACHEFOLDER 属性。它的值为'SIL\Transcelerator'。

...

行动 18:25:46:WixRemoveFoldersEx。 行动开始 18:25:46:WixRemoveFoldersEx。 MSI (s) (E4:00) [18:25:46:041]:调用远程自定义操作。 DLL:C:\Windows\Installer\MSI6019.tmp,入口点:WixRemoveFoldersEx MSI (s) (E4:78) [18:25:46:042]:生成随机 cookie。 MSI (s) (E4:78) [18:25:46:044]:使用 PID 18712 (0x4918) 创建了自定义操作服务器。 MSI (s) (E4:54) [18:25:46:067]:作为服务运行。 MSI (s) (E4:54) [18:25:46:069]:您好,我是您的 32 位模拟自定义操作服务器。 WixRemoveFoldersEx:递归路径:SIL\Transcelerator\ 用于行:wrfA9D8B049E87ACFF02034C5FFCFB64E42。 WixRemoveFoldersEx:未找到搜索路径:SIL\Transcelerator* 行动于 18:25:46 结束:WixRemoveFoldersEx。返回值 1。

...

MSI (s) (E4:44) [18:25:46:267]:执行操作:ComponentRegister(ComponentId=6A45D61D-EA73-4A8C-8941-B49A881ABB49,KeyPath=01:\Software\SIL\ Transcelerator\CachePath,State=3,,Disk=1,SharedDllRefCount=0,BinaryType=0) 1: 97A212AC-E01E-486A-A220-AF9BBBC79E87 2: 6A45D61D-EA73-4A8C-8941-B49A881ABB49 3: 01:\Software\SIL\Transcelerator\CachePath

...

MSI (s) (E4:44) [18:25:46:597]:执行操作:RegOpenKey(Root=-2147483647,Key=Software\SIL\Transcelerator,,BinaryType=0,,) MSI (s) (E4:44) [18:25:46:597]:执行操作:RegAddValue(Name=CachePath,Value=SIL\Transcelerator,) WriteRegistryValues:键:\Software\SIL\Transcelerator,名称:CachePath,值:SIL\Transcelerator

...

属性(S):CACHEFOLDER = SIL\Transcelerator

似乎没有任何相关内容被添加到注册表中。 (在某一时刻,它似乎正在添加一些具有正确 GUID 的内容来告诉它执行卸载操作,但现在我无法弄清楚我改变了什么才能让它消失。)并且 C 中没有文件或子文件夹: \Users\bogle\AppData\Local\SIL\Transcelerator 在安装或卸载时都会被删除。我还尝试从 On="both" 更改为 On="Uninstall" 以查看是否可以使其正常工作,但没有骰子。

【问题讨论】:

"SIL\Transcelerator" 不是有效的完整路径? RemoveFolderEx 的 Property 属性上的信息说它是“解析为源目录完整路径的属性的 id。”您希望 CACHEFOLDER 为“C:\Users\bogle\AppData\Local\SIL\Transcelerator” 是的,但我不知道如何做到这一点。 根据this article 和其他人的说法,将 [LocalAppData] 放在 RegistryKey 的 Value 属性中应该会导致它在当前用户的 AppData\Local 文件夹中添加根路径,但它对我不起作用。 当我使用 RemoveFolderEx 时,我刚刚读取了一个注册表项,该注册表项具有完整路径作为其值,就像您链接的文章一样。看起来属性名称实际上应该是“LocalAppDataFolder”msdn.microsoft.com/en-us/library/aa369768(v=vs.85).aspx 我也尝试过 LocalAppDataFolder,但没有任何区别。 【参考方案1】:

我最终使用了自定义操作,因为事实证明我真正需要做的是清除所有/所有用户的缓存文件,而不仅仅是当前用户。尤其如此,因为安装程序总是在提升的权限下运行,因此当前用户通常不会是我真正关心的用户。我会指出原始问题仍未解决,因此如果有人能找出问题并发布可能对其他人有帮助的替代答案,那可能会很有用。

【讨论】:

【参考方案2】:

目录属性的名称是LocalAppDataFolder,而不是LocalAppData。这没有定义,所以它是一个空字符串,并且给出的路径 RemoveFolderEx 无效(因此出现 Search path not found: SIL\Transcelerator 错误)。

【讨论】:

以上是关于如何在安装和卸载时使用 RemoveFolderEx 递归删除 LocalAppData 中的文件夹的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 上卸载 Atom 文本编辑器?

使用make安装时如何卸载mod_wsgi?

如何在安装 WiX Bundle 时避免卸载以前安装的 ExePackage(可再发行文件)?

如何在 WiX 中执行仅在安装或卸载时执行的自定义操作?

如何卸载 Eclipse?

如何在卸载时立即生成WIX执行命令