作为持续交付流程的一部分,我想在给定的计算机上安装MSI。msiexec加psexec可以完美地做到这一点,但是msiexec似乎只能登录到文件,我需要它才能登录到stdout / stderr。
现在,要将输出返回到我们的CI软件中,我必须添加第二步以回显日志的内容,这似乎没有意义。
是否有人曾经面对过这个问题(并克服了这个问题?)
在此先感谢您的任何帮助。
标记
作为持续交付流程的一部分,我想在给定的计算机上安装MSI。msiexec加psexec可以完美地做到这一点,但是msiexec似乎只能登录到文件,我需要它才能登录到stdout / stderr。
现在,要将输出返回到我们的CI软件中,我必须添加第二步以回显日志的内容,这似乎没有意义。
是否有人曾经面对过这个问题(并克服了这个问题?)
在此先感谢您的任何帮助。
标记
Answers:
我再次检查了一下,这里是一些更新的信息:
可以抑制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开销,安装程序的成本大大降低。
MsiExec
只能登录到文件,因此在安装程序完成后,您将必须继续回显该文件的内容。
我宁愿将MSI日志文件永久地在每次安装的公共位置上缓存在本地系统上,然后仅注册整个安装程序的退出代码。如果安装程序报告成功,则日志文件是否很有趣?只是更多的“噪音”?
除此之外,还有一些软件交付系统将捕获MSI安装的日志信息并将其集中存储。一个示例是SCCM(Microsoft更名为Systems Management Server-SMS)。
设置所有MSI文件的日志记录,请参阅“对于计算机上的所有设置都是全局的”部分:http : //www.installsite.org/pages/en/msifaq/a/1022.htm
我使用以下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