WiX工具集-用于在移除文件后运行卸载的自定义操作

WiX工具集-用于在移除文件后运行卸载的自定义操作,wix,sequence,custom-action,Wix,Sequence,Custom Action,在安装时,我使用命令行工具向DB添加配置密钥。卸载时,我现在尝试删除该配置密钥。升级时,我需要删除配置密钥,然后重新添加配置密钥 这是我的定制“修订”代码: 行在RemoveFiles之后运行,因此我的自定义操作失败,原因是: CAQuietExec: The system cannot find the path specified. CAQuietExec: Error 0x80070001: Command line returned an error. CAQuietExec: E

在安装时,我使用命令行工具向DB添加配置密钥。卸载时,我现在尝试删除该配置密钥。升级时,我需要删除配置密钥,然后重新添加配置密钥

这是我的定制“修订”代码:

行在RemoveFiles之后运行,因此我的自定义操作失败,原因是:

CAQuietExec:  The system cannot find the path specified.
CAQuietExec:  Error 0x80070001: Command line returned an error.
CAQuietExec:  Error 0x80070001: CAQuietExec Failed
在此之后,我的安装将回滚

此外,此条件是否适用于卸载或重新安装时运行

(!AppName = 3 AND (&AppName = 3 OR &AppName = 2))
谢谢

更新日期:2015年7月31日

虽然我仍然没有一个有效的解决方案,但我已经做了足够多的更改,可以发布我当前的代码

以下是我更新的自定义操作“修订”代码:


注意:这些更改是基于Kiran非常受欢迎的建议进行的,并模仿了一些对我有用的taskkill命令

工作代码示例:

<CustomAction Id="TaskKill_erl_exe_Cmd"
              Property="QtExecCmdLine"
              Value='"[SystemFolder]taskkill.exe" /F /IM erl.exe /T'                  
              Execute="immediate" />

<CustomAction Id="TaskKill_erl_exe"
              BinaryKey="WixCA"
              DllEntry="CAQuietExec"
              Execute="immediate"
              Return="ignore"/>

谢谢这里的几件事

-您正在尝试使用Wix提供的内置安静执行自定义操作,以立即模式执行自定义操作

如果您想在立即模式下使用CAQuietExec,文档明确建议您必须设置WixQuietExecCmdLine属性

我看你的情况没有这样做

在您的例子中,我看到您正在立即模式下设置一个名为Unset\u AppName\u Version的属性。这是行不通的

-如果您试图在延迟模式下使用caquietxec,则在粘贴的代码段中创建自定义操作将起作用,因为这将导致填充内置特殊属性“CustomActionData”的值

-如果您尝试启动的命令行工具是由msi软件包安装的,那么对于安装/升级/重新安装的情况,Id=“Unset\u AppName\u Version”的自定义操作必须在“InstallFiles”标准操作之后排序

对于卸载,我假设您将有一个单独的自定义操作,该操作使用一组不同的参数调用此命令行工具,并且应该在“RemoveFiles”标准操作之前对其进行排序

-最后,是的,您的条件是正确的,并且将在重新安装或卸载该功能时调用该操作

-此外,在运行msi包时,如果要确认命令行工具是否确实已启动,可以运行名为“ProcessMonitor”的实用程序。ProcessMonitor来自Sysinternals套件。通过设置适当的过滤器保持工具运行。 如果您的工具曾经启动过,ProcessMonitor将向您指示相同的情况


希望这能有所帮助。

这最终对我有用:

<CustomAction Id="Unset_AppName_Version_Cmd" 
              Property="QtExecCmdLine"
              Value="&quot;[SystemFolder]cmd.exe&quot; /C &quot;&quot;[SOMEDIR]SomeClTool&quot; &quot;uninstall:appname&quot;&quot;"
              Execute="immediate" />

<CustomAction Id="Unset_AppName_Version"
              BinaryKey="WixCA"
              DllEntry="CAQuietExec"
              Execute="immediate"
              Return="ignore" />

在InstallExecuteSequence中:

<Custom Action="Unset_AppName_Version_Cmd" Sequence="1215">
    (!AppName = 3 AND (&amp;AppName = 3 OR &amp;AppName = 2))     
</Custom>
<Custom Action="Unset_AppName_Version" Sequence="1216">
    (!AppName = 3 AND (&amp;AppName = 3 OR &amp;AppName = 2))
</Custom>

(!AppName=3和(&;AppName=3或&;AppName=2))
(!AppName=3和(&;AppName=3或&;AppName=2))
问题似乎是我的虚拟机在所有回滚过程中出现了一些混乱

我遇到的主要问题是,我最初试图在“Unset\u AppName\u Version\u Cmd”CustomAction中命名该属性


再次感谢Kiran的帮助。

谢谢。我已经切换到Property=“qtexecmdline”,这似乎有效。WixQuietExecCmdLine是更好的选择吗?我在RemoveFiles之前尝试了排序(我只希望在卸载或MajorUpgrade的卸载部分运行此功能)。我甚至将自定义操作放置在1200+序列范围内,没有任何条件。它按选定的顺序运行,但在删除文件后重试,这会导致失败和回滚。我已经尝试过oncePerProcess和firstSequence,试图让它只运行一次,但似乎没有什么能阻止WiX在删除文件后尝试运行。请使用Orca检查您构建的msi。Orca是windows installer SDK的一部分。检查InstallExecuteSequence表,并检查分配给自定义操作和移除文件的序列号。如果它是在RemoveFiles之后执行的,那么它将在以后排序。序列号实际上是相对的,它们可以根据当前自定义操作的数量而变化。好的方法是使用Orca检查msi包。另外,您是否使用Process Monitor检查了是否调用了正确的命令?再次感谢Kiran。我检查了奥卡,一切都很好,序列1211…1214。在详细日志中,我看到“Action ended 12:25:58:MigrateFeatureState”。然后,我看到我的条件测试为false,因此将跳过CustomActions。命令端(Unset_AppName_Version_Cmd)在“WriteEnvironmentStrings”之后运行,这似乎没有问题(在RemoveFiles之前)。问题是,Unset_AppName_版本直到InstallFinalize阶段才运行。我不理解延误。对于Unset\u AppName\u版本,您推荐什么作为执行和模拟(我去掉了这个)的设置?如果Unset\u AppName\u版本直到InstallFinalize才运行,很可能是一个延迟操作。你能把整个日志文件上传到某个地方吗?另外,您是否使用Process Monitor验证是否执行了正确的命令?让Execute=Deferred和Impersonate=No怎么样?为了更好地了解自定义操作是如何执行的,请阅读:www.installsite.org/pages/en/isnews/200108/Hi Kiran,我对我的原始问题进行了编辑,以向您展示我当前的自定义操作。自从出现这个问题以来,我一直在查看您提到的链接,但我会再次查看它。另外,你可以在ThanksI上查看整个日志。我很高兴你能让它正常工作。与以前的版本相比,现在的确切变化是什么?与其说是变化,不如说是我使用的虚拟机出现了问题。我删除的CustomAction仍显示在日志中,因此我返回到以前的快照。
<CustomAction Id="Unset_AppName_Version_Cmd" 
              Property="QtExecCmdLine"
              Value="&quot;[SystemFolder]cmd.exe&quot; /C &quot;&quot;[SOMEDIR]SomeClTool&quot; &quot;uninstall:appname&quot;&quot;"
              Execute="immediate" />

<CustomAction Id="Unset_AppName_Version"
              BinaryKey="WixCA"
              DllEntry="CAQuietExec"
              Execute="immediate"
              Return="ignore" />
<CustomAction Id="TaskKill_erl_exe_Cmd"
              Property="QtExecCmdLine"
              Value='"[SystemFolder]taskkill.exe" /F /IM erl.exe /T'                  
              Execute="immediate" />

<CustomAction Id="TaskKill_erl_exe"
              BinaryKey="WixCA"
              DllEntry="CAQuietExec"
              Execute="immediate"
              Return="ignore"/>
<CustomAction Id="Unset_AppName_Version_Cmd" 
              Property="QtExecCmdLine"
              Value="&quot;[SystemFolder]cmd.exe&quot; /C &quot;&quot;[SOMEDIR]SomeClTool&quot; &quot;uninstall:appname&quot;&quot;"
              Execute="immediate" />

<CustomAction Id="Unset_AppName_Version"
              BinaryKey="WixCA"
              DllEntry="CAQuietExec"
              Execute="immediate"
              Return="ignore" />
<Custom Action="Unset_AppName_Version_Cmd" Sequence="1215">
    (!AppName = 3 AND (&amp;AppName = 3 OR &amp;AppName = 2))     
</Custom>
<Custom Action="Unset_AppName_Version" Sequence="1216">
    (!AppName = 3 AND (&amp;AppName = 3 OR &amp;AppName = 2))
</Custom>