Wix RemoveFile 和 RemoveFolder 用于删除剩余内容

2023-11-30

我有以下 wix 文件,该文件应该在安装过程中调用自定义操作。自定义操作将创建程序所需的一些文件。由于 Wix 只会删除安装程序安装的文件,因此自定义操作创建的文件将被保留。所以我求助于删除文件由维克斯提供。

我有以下 Wix 文件。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="WixCustomAction" Language="1033" Version="1.0.0.0" Manufacturer="Sarvagya" UpgradeCode="1d77ebdc-2ba2-4b34-b013-7c8a8adcef5b">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <MediaTemplate EmbedCab="yes"/>

    <Feature Id="ProductFeature" Title="WixCustomAction" Level="1">
        <ComponentGroupRef Id="ProductComponents" />
  <!--<ComponentGroupRef Id="RemoveLeftOvers" />-->
</Feature>
</Product>

<Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
        <Directory Id="WindowsVolume">
            <Directory Id="INSTALLFOLDER" Name="LearningWix" />
        </Directory>
    </Directory>
</Fragment>

<Fragment>
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
  <Component Id="SomeDLL">
    <File Source="C:\boost_1_55_0_dyn\stage\lib\boost_atomic-vc100-mt-1_55.dll" />
  </Component>
  <Component Id="RemovingFiles">
    <RemoveFile Id="ConfigRemove" Name="lpa.config" On="uninstall"/>
    <RemoveFile Id="LogsRemove" Name="*.log" On="uninstall"/>
    <RemoveFile Id="ProductCodeRemove" Name="productcode.txt" On="uninstall"/>
  </Component>
    </ComponentGroup>    
<Binary Id="SetupCA"  SourceFile="..\LearnCustomAction\bin\Release\LearnCustomAction.CA.dll"/>
<CustomAction Id="FileWrite" Execute="immediate" BinaryKey="SetupCA" DllEntry="WriteFileToDisk" />
<InstallExecuteSequence>
  <Custom Action="FileWrite" Before="InstallFinalize"></Custom>
</InstallExecuteSequence>
</Fragment>

自定义操作将创建文件lpa配置文件 and 产品代码.txt。应用程序将创建输出.log,输出.1.log,...。但在编译过程中,我收到以下错误

The Component/@Guid attribute's value '*' is not valid for this component because it does not meet the criteria for having an automatically generated guid. Components using a Directory as a KeyPath or containing ODBCDataSource child elements cannot use an automatically generated guid. Make sure your component doesn't have a Directory as the KeyPath and move any ODBCDataSource child elements to components with explicit component guids.

我应该如何正确使用删除文件去除剩菜?我提到this但没有帮助。

UPDATE

我通过在组件标记中添加 GUID 解决了该问题。现在添加时RemoveFolder在上面的代码中例如:

    <RemoveFolder Id="LeftOverAppsRemove" On="uninstall" Directory="apps"/>
    <RemoveFolder Id="LeftOverTempRemove" On="uninstall" Directory="temp"/>

我遇到问题Unresolved reference to symbol 'Directory:apps' in section 'Fragment:'。我该如何解决?


您只能使用RemoveFolder元素来删除空文件夹,所以这没有多大帮助。 如果您有一个在应用程序目录中创建文件的 CustomAction,我建议您不要创建RemoveFile那些元素。通常,您将在应用程序目录中创建包含一次性数据的子文件夹,并且必须为添加到该目录的每个文件创建删除元素。解决这个问题的懒惰方法是利用删除FolderEx元素。如该页面所述,您必须使用记住属性模式使这项工作成功。 以下是如何实现这两种技术的示例:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
  <Fragment>
    <ComponentGroup Id="CommonFiles" Directory="INSTALLFOLDER">
        <Component Id="SomeDLL" Guid="PUT-GUID-HERE">
          <File Source="C:\boost_1_55_0_dyn\stage\lib\boost_atomic-vc100-mt-1_55.dll" />
          <util:RemoveFolderEx Id="RemoveAdditionalFiles" On="uninstall" Property="REMOVAL"/>
        </Component>
        <Component>
          <RegistryValue Root="HKCU" Key="SOFTWARE\YOURCOMPANY\YOURPRODUCT" Name="CompleteRemoval" Value="[INSTALLFOLDER]" Type="string"/>
          <RemoveFolder Id="Cleanup" On="uninstall"/>
        </Component>
    </ComponentGroup>
    <Property Id="REMOVAL">
      <RegistrySearch Id="RemovalProperty" Root="HKCU" Key="SOFTWARE\YOURCOMPANY\YOURPRODUCT" Name="CompleteRemoval" Type="raw" />
    </Property>
    <CustomAction Id='SaveCmdLineValue' Property='REMOVAL_CMD'
      Value='[REMOVAL]' Execute='firstSequence' />
    <CustomAction Id='SetFromCmdLineValue' Property='REMOVAL'
      Value='[REMOVAL_CMD]' Execute='firstSequence' />
    <InstallUISequence>
      <Custom Action='SaveCmdLineValue' Before='AppSearch' />
      <Custom Action='SetFromCmdLineValue' After='AppSearch'>REMOVAL_CMD</Custom>
    </InstallUISequence>
    <InstallExecuteSequence>
      <Custom Action='SaveCmdLineValue' Before='AppSearch' />
      <Custom Action='SetFromCmdLineValue' After='AppSearch'>REMOVAL_CMD</Custom>
    </InstallExecuteSequence>
  </Fragment>
</Wix>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Wix RemoveFile 和 RemoveFolder 用于删除剩余内容 的相关文章

随机推荐

  • python中的OpenCV透视变换

    我正在尝试用 python 校正图像 我有一个单应性 H 来自绕 x y 和 z 轴旋转的旋转矩阵 如下所示 9 95671447e 01 7 83610423e 02 7 47993630e 02 7 69292630e 02 9 965
  • QSqlQuery 准备好的语句 - 正确使用

    我正在尝试确定将准备好的语句与 QSqlQuery 一起使用的正确方法 这些文档对于这个主题不是很具体 void select const QSqlDatabase database QSqlQuery query database que
  • 如何使用 Golem Shiny 应用程序将 4 个盒子排成一排?

    我正在尝试将每行 4 个盒子放入我闪亮的应用程序中 BioTuring 和 Scope 我希望与 FLAT 和 GTEx 对齐在同一行 现在看起来是这样的 需要注意的是 这个应用程序是用 golem 结构完成的 因此 请在帮助时牢记并遵循我
  • 从 .mexglx 到 .mex

    我得到了一个使用外部 C 函数的 Matlab 程序 我只有这个外部函数的编译版本 扩展名是 mexglx 从我已经红色的来看 这个扩展似乎是用linux编译的mex文件版本 我在 Windows XP 下运行 matlab 我的问题是我的
  • 如何通过 NPM 脚本使用 Windows 控制台“设置”变量?

    这在 Windows 控制台中按预期工作 set A qwerty echo A 输出 qwerty 但是当我尝试在 NPM 脚本中运行相同的命令时 包 json scripts qwerty set A qwerty echo A gt
  • 使用 JavaScript 自动填写表单

    这是我的代码 function setActualDate var d1 new Date var y d1 getFullYear var d d1 getDate var m1 d1 getMonth 1 var m2 d1 getMo
  • HttpURLConnection POST,conn.getOutputStream() 抛出异常

    我想使用 HttpURLConnection 进行 POST 我正在以两种方式尝试这一点 但在执行时我总是会遇到异常 conn getOutputStream 我在这两种情况下得到的例外是 java net SocketException
  • Java Spring-data Mongo中的Mongodb请求

    我在文档中有一个数组 id id 1 name name 1 additionalData additionalDataId id 1 1 additionalDataName name 1 1 longText A long story
  • 创建一个pandas表

    在使用 pandas 时 如何显示与此类似的表格 我想我必须使用类似于的数据框df pandas DataFrame results 并显示它display display df 但从那里我不知道该怎么办 您可以将字典传递为data当你使用
  • 如何传递带有存储在单个变量中的引号的命令行参数?

    我想从 shell 脚本调用外部应用程序 但此 shell 脚本在单个变量中获取参数 来自其他脚本 一切都很好 直到我不必对单个参数使用双引号 而是用空格分隔单词 这是我的问题的简化示例 sh param 只是打印所有传递的参数 bin s
  • 在消息框中显示非英语文本

    我在 MS Access 中的应用程序中编写了以下代码 以波斯语 非英语 显示消息框 但是当我输入波斯语 Persion 时 它会键入一些特殊 未知 不同的字符 而且当我运行应用程序时 消息框显示特殊 不同的字符 而不是我想要显示的 msg
  • 在 boost::asio 的上下文中,术语“strand”背后的隐喻是什么?

    As a French native and a boost asio user I have added the strand word to my vocabulary is a toron in French here an imag
  • JAVA链表如何用for循环进行循环?

    您好 我正在尝试创建一个循环遍历链表的 for 循环 对于每条数据 它都会单独列出 我想在这里学习链表 所以没有数组建议 有人知道怎么做吗 示例输出 187 航班 501航班 到目前为止我的代码如下 public static Linked
  • 模拟 subprocess.Popen 依赖于导入样式

    当尝试模拟 Popen 时 只有当子进程的导入在单元测试代码和主模块代码中都匹配时 我才能使其成功 给出以下模块 listdir py from subprocess import Popen PIPE def listdir dir cm
  • ActiveMQ 5.11 与 WebSphere 应用程序服务器 8.5

    有谁知道我需要将 ActiveMQ 5 11 中的哪些 jar 与 IBM Websphere Application Server 8 5 一起使用才能创建新的 ActiveMQ JMS 提供程序 我发现与旧版 ActiveMQ 相关的讨
  • iOS 和 OSX 上的 Captive Network Assistant 上的 Ajax

    ajax 可以工作吗强制网络助手在 iOS 和 OSX 上 我在用jquery执行以下操作 但不起作用 这响应文本变量既不是 true 也不是 false 在适当的 Safari 浏览器以及 Android 和 Windows 设备上运行良
  • 从 sympy 求解二阶微分方程组

    我正在使用二阶拉格朗日方程解决多自由度动力学问题 我使用 sympy 来获取运动方程 现在计算导数后这些方程变得相当长 尽管 sympy 简化似乎无法进一步简化它 我的问题实际上是如何从这里解决这个由三个二阶颂歌组成的系统 我不知道如何转换
  • 如何实施单点登录

    我想实现 SSO 单点登录 我发现了很多关于 CAS OpenID 和许多不同事物的链接和文章 我真的迷失了那么我应该使用 CAS 吗 我安装了 CAS Server 并将其部署到 Tomcat 中 你下一步怎么做 或者这是错误的 您能解释
  • 使用 Facebook SDK 4.1.2 创建登录按钮时出现问题

    我正在尝试创建一个应用程序 该应用程序将允许用户通过他们的 Facebook 帐户登录 我想通过 eclipse 使用新的 Facebook SDK 4 1 2 为了在 eclipse 中使用新的 SDK 我遵循本教程 我现在可以在不使用
  • Wix RemoveFile 和 RemoveFolder 用于删除剩余内容

    我有以下 wix 文件 该文件应该在安装过程中调用自定义操作 自定义操作将创建程序所需的一些文件 由于 Wix 只会删除安装程序安装的文件 因此自定义操作创建的文件将被保留 所以我求助于删除文件由维克斯提供 我有以下 Wix 文件