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

How to use RemoveFolderEx to recursively remove folder in LocalAppData on install AND uninstall

这是我所拥有的(基于我从其他几个 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。 Return 值 1。

...

MSI (c) (38:F0) [18:25:45:594]:切换到服务器:PARATEXT7="C:\Program Files (x86)\Paratext 7\" PARATEXT7TEST="C:\Program Files (x86)\ParatextDir7Test\" PARATEXT8="C:\Program Files (x86)\Paratext 8\" PARATEXT8TEST ="C:\Program Files (x86)\ParatextDir8Test\" PARATEXT75100ORGREATER="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。 Return 值 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 的东西来告诉它执行卸载操作,但现在我无法弄清楚我改变了什么来让它消失。)和 none 文件或C:\Users\bogle\AppData\Local\SIL\Transcelerator 中的子文件夹在安装或卸载时被删除。我还尝试从 On="both" 更改为 On="Uninstall" 以查看我是否可以让它工作,但没有骰子。

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

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