【问题标题】:WIX - howto use RemoveFolderEx with On="install" / "both"?WIX - 如何将 RemoveFolderEx 与 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”似乎没什么区别

标签: wix


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多