安装后,我使用命令行工具将配置密钥添加到数据库。在卸载时,我现在正尝试删除该配置密钥。在升级时,我需要删除然后添加配置密钥。
这是我的CustomAction“编辑”代码:
<CustomAction Id="Unset_AppName_Version_Cmd"
Property="Unset_AppName_Version"
Execute="immediate"
Value=""[SystemFolder]cmd.exe" /C ""[SOMEDIR]SomeClTool" "uninstall:appname""" />
<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 (&AppName = 3 OR &AppName = 2))
</Custom>
<Custom Action="Unset_AppName_Version" Sequence="1216">
(!AppName = 3 AND (&AppName = 3 OR &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 (&AppName = 3 OR &AppName = 2))
由于
2015年7月31日更新
虽然我仍然没有可行的解决方案,但我做了足够的更改,发布我当前的代码是有意义的。
这是我更新的CustomAction“编辑”代码:
<CustomAction Id="Unset_AppName_Version_Cmd"
Property="QtExecCmdLine"
Value=""[SystemFolder]cmd.exe" /C ""[SOMEDIR]SomeClTool" "uninstall:appname"""
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"/>
由于
答案 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=""[SystemFolder]cmd.exe" /C ""[SOMEDIR]SomeClTool" "uninstall:appname"""
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 (&AppName = 3 OR &AppName = 2))
</Custom>
<Custom Action="Unset_AppName_Version" Sequence="1216">
(!AppName = 3 AND (&AppName = 3 OR &AppName = 2))
</Custom>
问题似乎是我的虚拟机中出现了所有回滚的东西。
我遇到的主要问题是我最初试图在&#34; Unset_AppName_Version_Cmd&#34;中命名该属性。 CustomAction。
再次感谢Kiran的帮助。