代码之家  ›  专栏  ›  技术社区  ›  FrantiÅ¡ek Žiačik

WIX自定义卸载操作-如何在MSI删除文件之前运行

  •  3
  • FrantiÅ¡ek Žiačik  · 技术社区  · 6 年前

    我有一个将文件添加到安装目录的自定义操作。卸载程序时,另一个自定义操作会尝试删除这些文件,以便可以删除安装目录。

    问题是我的自定义卸载操作正在运行 之后 删除标准安装文件,因此安装目录保留在那里,尽管它是空的。

    配置如下所示:

    <CustomAction Id="AddFilesAction" BinaryKey="installerActions" DllEntry="AddFiles" Execute="deferred" Return="check" Impersonate="no" />
    <CustomAction Id="CleanupAction" BinaryKey="installerActions" DllEntry="Cleanup" Execute="deferred" Return="check" Impersonate="no" />
    
    <InstallExecuteSequence>
      <Custom Action="CleanupAction" Before="InstallFiles">Installed</Custom>
      <Custom Action="AddFilesAction" After="InstallFiles">NOT Installed</Custom>
    </InstallExecuteSequence>
    

    我能做这个吗 CleanupAction 在MSI开始删除安装文件之前运行,以便自定义文件已被删除,并且MSI可以删除主安装目录?

    3 回复  |  直到 6 年前
        1
  •  6
  •   zett42    6 年前

    问题是,我的自定义卸载操作在删除标准安装文件后运行

    那是因为你以前安排过 InstallFiles ,后面是 RemoveFiles 在一个 standard InstallExecuteSequence . 您还可以在orca或insted这样的编辑器中打开msi文件,并查看 安装执行序列 表。按排序 Sequence 列以查看执行顺序。

    我能在msi开始删除之前运行cleanuppaction吗 安装文件

    当然,先安排好 删除文件 :

    <Custom Action="CleanupAction" Before="RemoveFiles">
        (REMOVE~="ALL") AND (NOT UPGRADINGPRODUCTCODE)
    </Custom>
    

    编辑: 在斯坦·斯梅尔让我意识到这一点后,我也改进了自定义动作条件。 See his answer 详细的推理。


    如果您还不知道,wix已经支持删除应用程序生成的文件,这些文件可能可以替换您的自定义操作。它的形式是 RemoveFile util:RemoveFolderEx 元素。

    如果这些不能满足您的需要,那么您仍然需要一个自定义操作,我建议为要删除的文件添加临时记录到 删除文件 运行时的表(在 立即的 自定义操作!)。这为您提供了使用MSI引擎进行实际文件删除的好处,即当用户决定取消卸载或发生错误时自动回滚。我以前也这样做过 RemoveFolderEx 所以如果你需要更多的信息,就再问一个问题。

        2
  •  4
  •   Stein Åsmul    6 年前

    简短回答 :你的情况和顺序似乎是错误的。请将清理自定义操作计划为在之前运行 RemoveFiles 或许可以设置一个更好的条件,使操作仅在需要时运行(而不是在意外的设置模式下)。以下是我的建议 (REMOVE~="ALL") AND (NOT UPGRADINGPRODUCTCODE) . 如果你使用这种条件,请彻底测试。 这种情况解释如下 .

    快速采样 :

    <InstallExecuteSequence>
      <Custom Action="CleanupAction" 
              Before="RemoveFiles">(REMOVE~="ALL") AND (NOT UPGRADINGPRODUCTCODE)</Custom>
    </InstallExecuteSequence>
    

    请务必阅读下面的细节。您可能还需要收紧复制文件操作的条件,否则它也将在主升级时运行,这可能是您所希望的,也可能不是您所希望的。


    自定义操作选项 : Please avoid custom actions if you can -总结一些自定义操作问题-它们很严重)。自定义操作是部署失败的主要原因。你确定你需要它们吗?通常有其他方法可以使用内置的msi功能或wix特定的构造来实现您在自定义操作中实现的功能。常见的例子有:安装服务、删除文件、更新xml文件或ini文件等…不过,有时自定义操作是必要的-很明显。 Zett42 has already written well about the alternatives ,所以我不会在这里重复-请检查他/她的答案。


    删除文件 :这里还有其他问题-我将尝试在下面描述这些问题-但是当标准操作 删除文件 跑。换句话说,您需要在 InstallExecuteSequence .


    条件 :您的情况 Installed 因为您的清理自定义操作将使自定义操作在 modify , repair minor upgrade patching 除了 uninstall major upgrade initiated uninstalls . 这很可能不是你想要的。要指定仅在卸载时运行,最常用的运行条件是 REMOVE~="ALL" . 这将使清理发生在手动启动的卸载和主要升级启动的卸载(不是你想要的我想)。你可以试试 (删除~=“all”)和(不升级产品代码) (仅在常规卸载时运行-不在主要升级卸载时运行)。


    提示 :即使对于有经验的wix/msi用户,条件也很容易出错。一些可能有帮助的资源:


    更多链接(供参考) :

        3
  •  0
  •   Doc    6 年前

    我不会在installinitialize和installfinalize之间安排您的操作。在初始化之前放置文件,在完成后清理文件。注意,在installfinalize之后,您将丢失属性值,您需要对此进行说明。

    推荐文章