无论如何让 msiexec 回显到标准输出而不是记录到文件

mrm*_*man 8 logging msi stderr stdout

作为持续交付管道的一部分,我想在给定的机器上安装 msi。msiexec plus psexec 完美地做到了这一点,但似乎 msiexec 只能登录到一个文件,而我需要它登录到 stdout/stderr。

现在,为了将输出返回到我们的 CI 软件中,我必须添加第二个步骤来回显日志的内容,这似乎有点毫无意义。

有没有人以前遇到过这个问题(并克服了它?)

在此先感谢您的帮助。

标记

Ste*_*mul 5

我再次检查了这个,这里是一些更新的信息

可以抑制 MSI GUI 并设置由第三方实现的外部 GUI。此外部 GUI 能够在执行安装时从msiexec.exe接收消息。这主要是为了实现自定义进度条,但似乎您还可以拦截大多数其他错误消息和状态消息:MsiSetExternalUI 函数

有趣的参数是dwMessageFilter。例如,通过设置此项,您可以仅接收安装期间出现的错误消息 - 或者看起来如此。我想这对于大多数用途来说已经足够了。

INSTALLUI_HANDLER MsiSetExternalUI(
  _In_  INSTALLUI_HANDLER puiHandler,
  _In_  DWORD dwMessageFilter,
  _In_  LPVOID pvContext
);
Run Code Online (Sandbox Code Playgroud)

遗憾的是,我目前没有这方面的示例代码。稍后,当我正确设置系统时,我将对此进行测试。该MsiEnableLog功能是相关的函数调用,将启用日志记录到文件中。更新:这看起来像是一个有效的 SDK 示例

命令行界面级别,您还可以通过添加! 范围:

msiexec.exe /I "IsWiX.msi" /QN /L*V! "C:\msilog.log" 
Run Code Online (Sandbox Code Playgroud)

这意味着日志文件是连续写入的,因此如果 msiexec.exe 崩溃,日志缓冲区不会丢失。由于 IO 开销,成本是一个明显较慢的安装程序。