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

8

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

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

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

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

отметка

mrmrcoleman
источник
Используйте встроенную функцию регистрации файлов в msiexec и считывайте данные с диска. Несколько процессов msiexec.exe могут быть запущены во время установки, и я думаю, вам будет сложно перенаправить вывод всех из них. Вы можете увидеть автоматически порожденные процессы msiexec.exe, работающие в разных контекстах безопасности, а также для запуска пользовательских действий. Банку с червями, я бы сказал, чтобы иметь дело с.
Стейн Осмул

Ответы:

5

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

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

Штейн Осмул
источник
3

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

Ансгар Вичерс
источник
1

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

Кроме этого, есть несколько систем доставки программного обеспечения, которые собирают информацию журнала для установки MSI и хранят ее централизованно. Одним из примеров является SCCM (Microsoft переименован в Сервер управления системами - SMS).

Настройка ведения журнала для всех файлов MSI, см. Раздел «Глобально для всех настроек на компьютере»: http://www.installsite.org/pages/en/msifaq/a/1022.htm.

Штейн Осмул
источник
0

Я использую следующий скрипт powershell. Он по-прежнему требует записи журнала в файл, но также записывает содержимое в реальном времени на стандартный вывод:

$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
inkychris
источник