WIX - 如何将 RemoveFolderEx 与 On="install" / "both" 一起使用?

Posted

技术标签:

【中文标题】WIX - 如何将 RemoveFolderEx 与 On="install" / "both" 一起使用?【英文标题】:WIX - howto use RemoveFolderEx with On="install" / "both"? 【发布时间】:2014-03-03 17:58:22 【问题描述】:

我正在尝试在“安装”(和“卸载”)中删除文件夹,但该文件夹仅在“卸载”时被删除。 任何提示如何做到这一点?

<Property Id="PACKAGEFOLDER">
  <RegistrySearch Root="HKLM" Key="$(var.RegKey)" Type="raw" Id="PKGFOLDER_REGSEARCH" Name="PkgDir" />
</Property>

<Directory Id="TARGETDIR" Name="SourceDir">
 <Directory Id="ProgramFilesFolder">
  <Directory Id="PACKAGE" Name="$(var.PkgFolder)">
   <Component Id="PackagesFiles" Guid="$(var.FilesGUID)">
    <RegistryValue Root="HKLM" Key="$(var.RegKey)" Name="PkgDir" Type="string" Value="[PACKAGE]" KeyPath="yes" />
    <util:RemoveFolderEx On="both" Property="PACKAGEFOLDER" />
   </Component>
  </Directory>
 </Directory>
</Directory>

刚刚注意到: 如果 RegKey 在安装开始之前在注册表中可用,它将起作用:

WixRemoveFoldersEx:递归路径:C:\Program Files (x86)... 行:wrf945C37509CA5EEDC2367957D5F072DFF。微星 (s) (94!A8) [19:17:55:185]:属性更改:添加 _UNOPACKAGEFOLDER_0 属性。 它的值是 'C:\Program Files (x86)... MSI (s) (94:D4) [19:17:55:185]:执行操作:CostInitialize

但如果 R​​egKey 不在注册表中,日志会显示:

WixRemoveFoldersEx:错误 0x80070057:缺少文件夹属性: 行的应用程序文件夹:wrfA308D08284221970F6338358BFB75917 CustomAction WixRemoveFoldersEx 返回实际错误代码 1603 但 由于继续标记 MSI (s) (84:50),将转换为成功 [19:29:08:529]:执行操作:CostInitialize

是否可以在设置属性“PACKAGEFOLDER”之前写入RegKey?

【问题讨论】:

删除“KeyPath”似乎没什么区别 【参考方案1】:

我假设您在此文件夹中也有应该删除的文件。如果没有包含文件的(任意)子目录,则应该使用 Windows Installer 的RemoveFile-table 直接进行。由于它只会在文件夹为空时删除该文件夹,因此添加一个附加条目将删除其中的文件,例如:

<Directory Id="TARGETDIR" Name="SourceDir">
 <Directory Id="ProgramFilesFolder">
  <Directory Id="PACKAGE" Name="$(var.PkgFolder)">
   <Component Id="PackagesFiles" Guid="$(var.FilesGUID)">
    <RegistryValue Root="HKLM" Key="$(var.RegKey)" Name="PkgDir" Type="string" Value="[PACKAGE]" KeyPath="yes" />
    <RemoveFile Id="RemovePACKAGEFolderFiles" Directory="PACKAGE" Name="*.*" On="both" />
    <RemoveFolder Id="RemovePACKAGEFolder" Directory="PACKAGE" On="both" />
   </Component>
  </Directory>
 </Directory>
</Directory>

这样您就不必处理任何属性设置。如果您有其他包含文件的子目录,您也必须对这些文件重复此操作。

另一种方法是在系统上下文中创建一个延迟自定义操作,该操作将完全删除文件夹,例如在 VBScript 中。

【讨论】:

非常感谢您的提示,但不幸的是,我的文件夹包含许多名称未知的子文件夹和文件。作为一种解决方法,我现在使用第二个 msi(“预安装”),它将设置必要的注册表项。 也许您还可以为属性提供默认参数。这样,它将使用 RegSearch 的值,如果未找到注册表项,则仅使用提供的默认值(即属性元素的值属性)。 属性>【参考方案2】:

如果你添加 &lt;SetProperty Id="PACKAGEFOLDER" Value="[PACKAGE]" After="CostFinalize" /&gt;,可以在安装过程中获取package的值。来自this article regarding property-setting。

【讨论】:

以上是关于WIX - 如何将 RemoveFolderEx 与 On="install" / "both" 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

在 WiX 3.7 中结合绝对路径和相对路径

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

如何创建将同时安装到 IIS6 和 IIS7 的 WIX 安装程序

如何将 UI 添加到 WiX 3 安装程序?

如何将文件添加到 WiX Burn 中的 Container 元素?

WiX Burn:如何将安装程序可执行文件部署到某个位置?