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
但如果 RegKey 不在注册表中,日志会显示:
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 的值,如果未找到注册表项,则仅使用提供的默认值(即属性元素的值属性)。如果你添加
<SetProperty Id="PACKAGEFOLDER" Value="[PACKAGE]" After="CostFinalize" />
,可以在安装过程中获取package的值。来自this article regarding property-setting。
【讨论】:
以上是关于WIX - 如何将 RemoveFolderEx 与 On="install" / "both" 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
如何在安装和卸载时使用 RemoveFolderEx 递归删除 LocalAppData 中的文件夹
如何创建将同时安装到 IIS6 和 IIS7 的 WIX 安装程序