我正在尝试删除“安装”(和“卸载”)上的文件夹,但该文件夹仅在“卸载”时删除。 有什么提示可以做到这一点?
<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 row: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?
我假设您还有此文件夹中的文件应删除。如果没有(任意)子目录包含文件,则应使用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中。
如果添加<SetProperty Id="PACKAGEFOLDER" Value="[PACKAGE]" After="CostFinalize" />
,则可以在安装期间获取包的值。来自this article regarding property-setting。