WIX - 如何使用RemoveFolderEx和On =“install”/“both”?

时间:2014-03-03 17:58:22

标签: wix

我正在尝试删除“安装”(和“卸载”)上的文件夹,但该文件夹仅在“卸载”时删除。
有什么提示可以做到这一点吗?

<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)... for   行:wrf945C37509CA5EEDC2367957D5F072DFF。 MSI(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:缺少文件夹属性:   行的APPLICATIONFOLDER:wrfA308D08284221970F6338358BFB75917   CustomAction WixRemoveFoldersEx返回实际的错误代码1603但是   由于继续标记MSI(84:50),将被转化为成功   [19:29:08:529]:采取行动:CostInitialize

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

2 个答案:

答案 0 :(得分:0)

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

<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中。

答案 1 :(得分:0)

如果添加 <SetProperty Id="PACKAGEFOLDER" Value="[PACKAGE]" After="CostFinalize" />,您可以在安装过程中获得软件包的价值。来自this article regarding property-setting