Назад | Перейти на главную страницу

Есть ли способ заставить msiexec выводить эхо на стандартный вывод вместо записи в файл

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

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

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

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

отметка

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

Можно отключить графический интерфейс 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 переименовала 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