Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WIX-如何在On=”的情况下使用RemoveFolderEx;安装";/&引用;两者都是;?_Wix - Fatal编程技术网

WIX-如何在On=”的情况下使用RemoveFolderEx;安装";/&引用;两者都是;?

WIX-如何在On=”的情况下使用RemoveFolderEx;安装";/&引用;两者都是;?,wix,Wix,我试图在“安装”(和“卸载”)时删除文件夹,但该文件夹仅在“卸载”时删除。 有什么提示可以做到这一点吗 <Property Id="PACKAGEFOLDER"> <RegistrySearch Root="HKLM" Key="$(var.RegKey)" Type="raw" Id="PKGFOLDER_REGSEARCH" Name="PkgDir" /> </Property> <Directory Id="TARGETDIR" Name=

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

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

刚刚注意到: 如果在安装开始之前注册表中有可用的注册表项,则它将工作:

WixRemoveFoldersEx:递归路径:C:\Program Files(x86)。。。对于 世界其他地区:wrf945C37509CA5EEDC2367957D5F072DFF。MSI(s)(94!A8) [19:17:55:185]:属性更改:添加_UNOPACKAGEFOLDER_0属性。 其值为“C:\ProgramFiles(x86)。。。微星(s)(94:D4) [19:17:55:185]:执行操作:成本初始化

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

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


是否可以在设置属性“PACKAGEFOLDER”之前写入注册表项?

我假设您在该文件夹中也有应该删除的文件。如果没有包含文件的(任意)子目录,则应直接使用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中。如果添加
,您可以在安装过程中获取软件包的值。从

删除“KeyPath”似乎没有什么区别。非常感谢这个提示,但不幸的是,我的文件夹中包含许多子文件夹和名称未知的文件。作为一种解决方法,我现在使用第二个msi(“预安装”),它将设置必要的注册表项。也许您还可以为属性提供一个默认参数。这样,它将使用RegSearch的值,如果找不到注册表项,则只使用提供的默认值(即Property元素的value属性)。