【问题标题】:WiX Toolset - CustomAction for uninstall running after RemoveFilesWiX 工具集 - 在 RemoveFiles 之后运行的用于卸载的 CustomAction
【发布时间】:2015-07-28 19:00:25
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: wix sequence custom-action


    【解决方案1】:

    这里有几件事。

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

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

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

    我认为你的情况没有这样做。

    在您的情况下,我看到您正在立即模式下设置一个名为 Unset_AppName_Version 的属性。这只是行不通。

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

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

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

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

    -同样当你运行你的msi包时,如果你想确认命令行工具是否确实启动了,你可以运行一个名为“ProcessMonitor”的实用程序。 ProcessMonitor 来自 Sysinternals 套件。通过设置适当的过滤器保持工具运行。 如果您的工具曾经启动过,ProcessMonitor 会向您显示相同的信息。

    希望这会有所帮助。

    【讨论】:

    • 谢谢。我已经切换到 Property="QtExecCmdLine",这似乎有效。 WixQuietExecCmdLine 是更好的选择吗?我在 RemoveFiles 之前尝试了排序(我只想在卸载或 MajorUpgrade 的卸载部分运行它)。我什至将自定义操作无条件放置在 1200+ 序列范围内。它以选定的顺序运行,但在 RemoveFiles 之后再次尝试,这会导致失败和回滚。我试过 oncePerProcess 和 firstSequence 试图让它只运行一次,但似乎没有什么能阻止 WiX 在 RemoveFiles 之后尝试运行。
    • 使用 Orca 检查您构建的 msi。 Orca 是 Windows 安装程序 SDK 的一部分。检查 InstallExecuteSequence 表并检查分配给您的自定义操作以及 RemoveFiles 的序列号。如果它在 RemoveFiles 之后执行,则稍后对其进行排序。序列号确实是相对的,它们可以根据存在的自定义操作的数量而改变。好的方法是使用 Orca 检查 msi 包。另外,您是否使用 Process Monitor 检查过是否调用了正确的命令?
    • 再次感谢基兰。我检查了 Orca,一切看起来都很好,序列 1211...1214。在详细日志中,我看到“操作于 12:25:58 结束:MigrateFeatureStates”。然后我看到我的条件测试为假,所以 CustomActions 被跳过。命令端(Unset_AppName_Version_Cmd)在“WriteEnvironmentStrings”之后运行,这似乎没问题(在 RemoveFiles 之前)。问题是 Unset_AppName_Version 直到 InstallFinalize 阶段才会运行。我不明白延迟。对于 Unset_AppName_Version 的 Execute 和 Impersonate(我摆脱了这个),你推荐什么设置?
    • 如果 Unset_AppName_Version 直到 InstallFinalize 才运行,它很可能是延迟操作。你能把你的整个日志文件上传到某个地方吗?另外,您是否使用 Process Monitor 验证了正确的命令正在执行?让 Execute=Deferred 和 Impersonate=No 怎么样?要更好地了解自定义操作的执行方式,请阅读:www.installsite.org/pages/en/isnews/200108/
    • 您好 Kiran,我已对我的原始问题进行了编辑,以向您展示我当前的 CustomActions。自从遇到此问题以来,我一直在查看您提到的链接,但我会再次查看。另外,您可以通过dropbox.com/s/sour7cl79ovo5d7/msi.log?dl=0查看整个日志,谢谢
    【解决方案2】:

    这最终对我有用:

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

    问题似乎是由于所有回滚,我的 VM 中出现了问题。

    我遇到的主要问题是我最初尝试在“Unset_AppName_Version_Cmd”CustomAction 中命名该属性。

    再次感谢 Kiran 的所有帮助。

    【讨论】:

    • 我很高兴你已经让它工作了。与您的早期版本相比,现在的确切变化是什么?
    • 变化不大,因为我使用的虚拟机似乎存在问题。我删除的 CustomAction 仍然显示在日志中,所以我恢复到之前的快照。
    猜你喜欢
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多