WiX工具集 - 用于在RemoveFiles之后运行的卸载的CustomAction

时间:2015-07-28 19:00:25

标签: wix sequence custom-action

安装后,我使用命令行工具将配置密钥添加到数据库。在卸载时,我现在正尝试删除该配置密钥。在升级时,我需要删除然后添加配置密钥。

这是我的CustomAction“编辑”代码:

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

<CustomAction Id="Unset_AppName_Version"
              BinaryKey="WixCA"
              DllEntry="CAQuietExec"
              Execute="immediate"
              Return="check"
              Impersonate="yes" />

注意:我已经尝试了几个执行值,包括oncePerProcess,firstSequence和immediate。

这是我的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>

注意:同样,我试图移动使用的序列。在上面的例子中,在InstallValidate之前,还要在RemoveFiles,RemoveODBC等之前。

没有什么对我有用。在所有情况下,

Executing op: ActionStart(Name=Unset_AppName_Version,,)
在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 (&amp;AppName = 3 OR &amp;AppName = 2))

由于

2015年7月31日更新

虽然我仍然没有可行的解决方案,但我做了足够的更改,发布我当前的代码是有意义的。

这是我更新的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" />

注意:这些更改是基于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"/>

由于

2 个答案:

答案 0 :(得分:1)

这里有很多事情。

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

http://wixtoolset.org/documentation/manual/v3/customactions/qtexec.html

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

我不认为你的情况已经完成了。

在您的情况下,我发现您正在立即模式中设置名为 Unset_AppName_Version 的属性。这就行不通。

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

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

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

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

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

希望这有帮助。

答案 1 :(得分:0)

这最终为我工作:

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

问题似乎是我的虚拟机中出现了所有回滚的东西。

我遇到的主要问题是我最初试图在&#34; Unset_AppName_Version_Cmd&#34;中命名该属性。 CustomAction。

再次感谢Kiran的帮助。