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.
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:
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.