Есть ли в любом случае, чтобы получить msiexec для вывода на стандартный вывод вместо входа в файл

В рамках конвейера непрерывной доставки я бы хотел установить msi на данную машину. msiexec plus psexec делает это отлично, но кажется, что msiexec может только войти в файл, и мне нужно, чтобы войти в stdout / stderr.

Прямо сейчас, чтобы вернуть вывод в наше программное обеспечение CI, мне нужно будет добавить второй шаг, чтобы отобразить содержимое журнала, что кажется немного бессмысленным.

Кто-нибудь сталкивался с этой проблемой раньше (и преодолел ее?)

Заранее спасибо за любую помощь здесь.

отметка

3 ответа

Я проверил это снова, и вот некоторая обновленная информация:

Можно подавить графический интерфейс MSI и установить внешний графический интерфейс, реализованный третьей стороной. Этот внешний графический интерфейс может получать сообщения от 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 буфер журнала не теряется. Стоимость установки значительно медленнее из-за накладных расходов ввода-вывода.

MsiExec может войти только в файл, поэтому вам придется продолжать отображать содержимое этого файла после завершения установки.

Я бы предпочел постоянно кэшировать файл журнала MSI в локальной системе в общем месте для каждой установки, а затем просто зарегистрировать код завершения всей установки. Если установка сообщает об успехе, файл журнала довольно неинтересен? Просто больше "шума"?

Кроме этого, существует несколько систем доставки программного обеспечения, которые собирают информацию журнала для установки MSI и хранят ее централизованно. Одним из примеров является SCCM (Microsoft переименован в Сервер управления системами - 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
Другие вопросы по тегам