【问题标题】:Windows Installer Deferred execution - how can we log the custom actions running in deferred mode?Windows Installer 延迟执行 - 我们如何记录在延迟模式下运行的自定义操作?
【发布时间】:2019-08-21 21:43:20
【问题描述】:

在我的 MSI 中,我添加了 2 个自定义操作以延迟执行。我无法在详细日志中看到这 2 个自定义操作,以查看这些操作是否已执行。我可以看到以即时模式执行的所有其他标准和自定义操作,但不能看到延迟。这是预期的行为吗?请帮忙

【问题讨论】:

  • 确保使用最详细的日志记录形式,即:MSIEXEC /i xxxx.msi /L*V C:\temp\yourlog.log 等......
  • 我使用了相同的,但我找不到延迟的自定义操作是否执行。
  • 请告诉我们您使用什么工具来构建 MSI,以及您使用什么语言进行自定义操作?是VBScript吗?如果是 VBScript,请在​​我的回答中查看下面 PDF 的链接,并阅读有关 VBScript 的部分 (direct link to article)。如果还是不行,也许你可以把源码放到 github.com 上快速浏览一下?我想我有一个答案,它显示了 VBScript 自定义操作的基本 WiX 标记,我很快就会挖掘出来。
  • 我把第一个答案搞砸了,太多的链接和细节。请在 github.com 上查看带有示例项目链接的新答案

标签: windows-installer


【解决方案1】:

WiX 和 VBScript:以下是一些答案,展示了如何在 MSI 中正确使用 VBScript 自定义操作 - 将其与下面显示的日志记录方法相结合,您应该会找到所有您在日志中写入的信息:


更新:您的设置很可能在调用自定义操作之前已中止?或者您的自定义操作崩溃并且没有返回错误?通常,您会在日志中看到以下条目:

"Invoking remote custom action"
"Created Custom Action Server with PID DECVAL (0xHEXVAL)."
"Hello, I'm your 32bit Impersonated custom action server."

等等...最后一个变种非常舒适。 “你好,32 位服务器”。


综合日志记录:请使用 extra debugging information 启用 verbose logging 并使用 @987654335 @。后者是为了避免自定义操作崩溃时丢失缓冲区。日志文件是直接写入而不是分批写入的,这会大大减慢安装速度。 I would recommended this logging variant for your case:

msiexec.exe /i C:\Path\Your.msi /L*vx! C:\Your.log

提示:在日志文件中搜索 "value 3" 以查找 Rob Mensching(Wix & Orca 作者)解释的错误。


MSI 日志记录:有关 msiexec.exe 日志记录的更多信息:

WiX MSI 日志记录:当您使用WiX's Visual Studio integration 时,您可以创建一个新的自定义操作项目,您可以使用内置的他们在自定义操作中提供的日志记录:

[CustomAction]
public static ActionResult CustomAction1(Session session)
{
   session.Log("Begin CustomAction1");

   return ActionResult.Success;
}

C++:以上是托管代码 C# 自定义操作,C++ 也有一个模板(至少曾经有)。我更喜欢后者以减少依赖。


自定义操作记录:您的自定义操作可以写入日志文件,如下所示:MSI Tip: Writing to the Log File from a Custom Action。这是通过自定义操作代码完成的 - 您可能已经这样做了?


链接

【讨论】:

  • 嗨 Stein.. 感谢您分享您的观点。请找到我的 cmets: Stein:您的设置很可能在调用自定义操作之前已中止? Sandy:没有 Stein:您的自定义操作崩溃并且没有返回错误? Sandy:没有。MSI 安装成功并且延迟的自定义操作正在执行,没有任何问题(我已经放置了运行良好的 vbscript msgbox)
  • 嗨桑迪。您是否在自定义操作代码中使用日志记录方法看到了上面链接到的 PDF?您是否将托管代码自定义操作与 WiX 模板项目中可用的日志记录一起使用?我不确定您使用什么工具来制作 MSI。
  • VBScript 可能是一个测试自定义操作,还是您只使用 VBScript?在某些情况下,VBScripts 崩溃,然后 MSI 继续运行,看起来自定义操作运行但它没有运行。也可以将 VBScript 保存为错误的编码,使其无法运行。尝试将脚本文件保存为 ANSI 编码(本质上是带有代码页的 ASCII - 避免使用奇怪的字符)。
【解决方案2】:

Github.com:添加一个新答案,因为旧答案很乱。这里有一个示例项目,您可以尝试:https://github.com/glytzhkof/allVBScriptWriteToLog 以 zip 或文件形式(相同文件)。该项目将展示如何从 VBScript 直接登录到 MSI 日志文件的示例。

片段:以下是一些提取的关键标记:

<Binary Id='CA.vbs' SourceFile='CA.vbs' />
<CustomAction Id='CA.vbs' VBScriptCall='' BinaryKey='CA.vbs' Execute='immediate' Return='ignore' />

<InstallExecuteSequence>
  <Custom Action='CA.vbs' After='InstallInitialize'>NOT Installed AND NOT REMOVE~="ALL"</Custom>
</InstallExecuteSequence>
  • 延迟/立即:只需将 Execute='immediate' 更改为 Execute='deferred' 即可延迟运行而不是立即运行。李>
  • ANSI 编码:确保 VBScript 文件以 ANSI 文本编码保存。
  • 条件:自定义操作序列的 MSI 条件应使其在全新安装时运行,而不是在卸载(或主要升级)时运行。这是我留在里面的一种普通的“遗物”。

测试:安装后在 MSI 日志文件中搜索“正在调用 LoggingTestVBS...”。如果它不存在,则可能是您的日志文件错误。请参阅下面的最简单的日志记录命令。

Express Logging:来自cmd.exe 的最简单的日志记录。

msiexec.exe /i C:\Path\Your.msi /L*v C:\Your.log

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    相关资源
    最近更新 更多