无论如何,有没有要让msiexec回显到stdout而不是登录到文件


8

作为持续交付流程的一部分,我想在给定的计算机上安装MSI。msiexec加psexec可以完美地做到这一点,但是msiexec似乎只能登录到文件,我需要它才能登录到stdout / stderr。

现在,要将输出返回到我们的CI软件中,我必须添加第二步以回显日志的内容,这似乎没有意义。

是否有人曾经面对过这个问题(并克服了这个问题?)

在此先感谢您的任何帮助。

标记


使用msiexec的内置文件日志记录,然后从磁盘读取。在安装过程中可以启动几个msiexec.exe进程,我想您很难重定向所有这些进程的输出。您可能会看到自动生成的msiexec.exe进程在不同的安全上下文中运行,并且还运行自定义操作。我会说要处理一罐蠕虫。
斯坦·奥斯穆尔(SteinÅsmul)2014年

Answers:


5

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

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

有趣的参数是dwMessageFilter。通过设置此项,您可以例如仅接收安装过程中发生的错误消息-看起来如此。我想这对于大多数目的已经足够了。

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开销,安装程序的成本大大降低。



1

我宁愿将MSI日志文件永久地在每次安装的公共位置上缓存在本地系统上,然后仅注册整个安装程序的退出代码。如果安装程序报告成功,则日志文件是否很有趣?只是更多的“噪音”?

除此之外,还有一些软件交付系统将捕获MSI安装的日志信息并将其集中存储。一个示例是SCCM(Microsoft更名为Systems Management Server-SMS)。

设置所有MSI文件的日志记录,请参阅“对于计算机上的所有设置都是全局的”部分:http : //www.installsite.org/pages/en/msifaq/a/1022.htm


0

我使用以下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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.