作为持续交付管道的一部分,我想在给定的机器上安装一个 msi。msiexec plus psexec 可以完美地完成这项工作,但似乎 msiexec 只能记录到文件中,而我需要它记录到 stdout/stderr。
现在,为了将输出返回到我们的 CI 软件,我必须添加第二步来回显日志的内容,这似乎有点无意义。
有人遇到过这个问题吗(并克服了它?)
在此先感谢你们提供的任何帮助。
标记
答案1
我再次检查了一下,这是一些更新的信息:
可以抑制 MSI GUI 并设置外部图形用户界面由第三方实现。此外部 GUI 能够从执行程序执行安装时。这主要是为了实现自定义进度条,但似乎你也可以拦截大多数其他错误消息和状态消息:MsiSetExternalUI 函数。
有趣的参数是消息过滤器。通过设置此项,您可以,例如,只接收安装过程中发生的错误消息 - 或看起来如此。我想这对于大多数目的来说已经足够了。
INSTALLUI_HANDLER MsiSetExternalUI(
_In_ INSTALLUI_HANDLER puiHandler,
_In_ DWORD dwMessageFilter,
_In_ LPVOID pvContext
);
遗憾的是,我目前没有这方面的示例代码。稍后我将在系统正确设置后测试它。MsiEnableLog 函数是一个相关函数调用,它将启用记录到文件的功能。更新:以下是一个可行的 SDK 示例。
在命令行界面级别,您还可以通过添加以下代码将日志记录设置为立即将其缓冲区刷新到文件!范围:
msiexec.exe /I "IsWiX.msi" /QN /L*V! "C:\msilog.log"
这意味着日志文件是连续写入的,因此即使 msiexec.exe 崩溃,也不会丢失日志缓冲区。代价是安装程序会因 IO 开销而显著变慢。
答案2
MsiExec
只能记录到一个文件,因此安装程序完成后,您必须继续回显该文件的内容。
答案3
我宁愿将 MSI 日志文件永久缓存在本地系统上每个安装的公共位置,然后只注册整个安装的退出代码。如果安装报告成功,日志文件就没什么意思了?只是更多的“噪音”?
除此之外,还有几种软件交付系统可以捕获 MSI 安装的日志信息并将其集中存储。一个例子是 SCCM(Microsoft 更名为系统管理服务器 - SMS)。
设置所有 MSI 文件的日志记录,请参阅“全局针对一台机器上的所有设置”部分:http://www.installsite.org/pages/en/msifaq/a/1022.htm
答案4
我使用以下 powershell 脚本。它仍然需要将日志写入文件,但它也会将内容实时写入 stdout:
$main_process = Start-Process -FilePath ".\installer.exe" -ArgumentList "/S /V`"/qn /l*! output.log`"" -NoNewWindow -PassThru
$log_process = Start-Process "powershell" "Get-Content -Path output.log -Wait" -NoNewWindow -PassThru
$main_process.WaitForExit()
$log_process.Kill()
exit $main_process.ExitCode