Logging – Get Msiexec to Echo to Stdout Instead of Logging to File

loggingmsistderrstdout

As part of a continuous delivery pipeline I'd like to install an msi on a given machine. msiexec plus psexec does this perfectly, but it seems that msiexec can only log to a file and I need it to log to stdout/stderr.

Right now, to get the output back into our CI software I'll have to add a second step to echo the contents of the log, which seems a bit pointless.

Has anybody faced this issue before (and overcome it?)

Thanks in advance for any help here.

Mark

Best Answer

I checked this again, and here is some updated information:

It is possible to suppress the MSI GUI and set an external GUI implemented by a third party. This external GUI is able to receive messages from msiexec.exe as it performs the installation. This is mostly to implement a custom progress bar, but it seems you can also intercept most other error messages and status messages: MsiSetExternalUI function.

The interesting parameter is the dwMessageFilter. By setting this you can, for example, receive only the error messages that occur during the installation - or so it would seem. I suppose this can be enough for most purposes.

INSTALLUI_HANDLER MsiSetExternalUI(
  _In_  INSTALLUI_HANDLER puiHandler,
  _In_  DWORD dwMessageFilter,
  _In_  LPVOID pvContext
);

Regrettably I do not have sample code for this at the moment. I will test this later, when I get my system set up properly. The MsiEnableLog function is a related function call that will enable logging to file. Update: Here is what looks like a working SDK example.

At the command line interface level, you can also set logging to flush its buffer immediately to file by adding the ! parameter:

msiexec.exe /I "IsWiX.msi" /QN /L*V! "C:\msilog.log" 

This means the log file is written continuously so no log buffer is lost if msiexec.exe crashes. The cost is a significantly slower installer due to the IO overhead.

Related Topic