коды возврата MSI в Inno Setup - PullRequest
       17

коды возврата MSI в Inno Setup

8 голосов
/ 24 февраля 2009

Я хотел бы вызвать несколько MSI-файлов в режиме без вывода сообщений и остановить всю установку в случае сбоя.

Можно ли получить коды возврата msiexec.exe, вызываемого из раздела [run]?

В настоящее время я вижу сообщения об ошибках только в средстве просмотра событий Windows.

Ответы [ 2 ]

5 голосов
/ 24 февраля 2009

В настоящее время нет способа проверить успешное выполнение [Run] записей. Код просто регистрирует код завершения процесса и продолжает следующую запись (это можно посмотреть в исходном файле Inno Setup Main.pas , функция ProcessRunEntry () , начиная с строка 3404 в текущей версии 5.2.3).

Если вам нужно убедиться, что несколько выполнений msiexec были успешными, вам нужно кодировать промежуточный уровень. Это может быть просто небольшая заглушка, которая выполняется в записях [Run] и запускает msiexec.exe с правильными параметрами, ожидает завершения процесса, а затем записывает код возврата в файл.

Еще один способ проверить успешность такого шага установки - добавить вызов пользовательской процедуры для каждой записи [Run] с помощью параметра AfterInstall . В такой функции вы можете, например, проверить, был ли успешно установлен элемент управления OCX:

[Run]
Filename: "{tmp}\MyInstallation1.exe"; Parameters: "/foo"; AfterInstall: AfterMyInstallation1

[Code]
var
  MyInstallation1Success: boolean;

procedure AfterMyInstallation1;
var
  V: Variant;
begin
  try
    V := CreateOleObject('MyInstallation.InstalledOcxControl.1');
    MyInstallation1Success := True;
  except
    MyInstallation1Success := False;
  end;
end;

или все ли каталоги и записи реестра для зависимости.

Каждая запись [Run] выполняется только в том случае, если ее необязательный параметр Check возвращает значение true. Таким образом, в зависимости от ваших потребностей вы можете либо запустить все установки без вывода сообщений по очереди, либо после того, как последний завершит выполнение, выполнить функцию сценария, чтобы проверить, что все зависимости были успешно установлены; или вы могли бы написать функцию проверки для каждой установки зависимостей, которая затем возвращала бы false и, таким образом, пропускала все остальные установки после первой неудачной установки.

Обратите внимание, однако, что все записи [Run] выполняются после выполнения шагов для копирования файлов, записи в реестр и т. Д., Поэтому вы в основном уже закончили установку. Если вы действительно хотите выполнить все шаги установки только тогда, когда все зависимости установлены правильно, вам придется сделать это раньше в процессе, когда установку все еще можно отменить.

Редактировать: Ознакомьтесь с вопросом «Как сделать так, чтобы Inno Setup не выглядела застывшей при выполнении длинного Exec?» , где дается некоторая информация и пример сценария связан об использовании функции Exec () для установки зависимостей. Поэтому, если вы не используете записи [Run] , есть хороший шанс достичь желаемого.

1 голос
/ 20 июня 2014

Вы можете использовать мой ответ на аналогичный вопрос для безопасного выполнения команд в разделе [Выполнить] с надлежащим уведомлением и откатом при ошибке.

Ссылка выше предоставляет полное решение, но идея выглядит следующим образом:

1) Записать сообщение об ошибке во временный файл {tmp} \ install.error с помощью параметра InInSetup BeforeInstall.

2) Используйте командную оболочку Windows «cmd.exe / s / c» для запуска нужной программы. Также используйте условное выполнение команды "del" с "&&" - http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ntcmds_shelloverview.mspx?mfr=true., поэтому файл сообщения об ошибке будет удален при успешном выполнении команды (код выхода 0). Обратите внимание на обработку специальных кавычек в "cmd.exe / s / c".

3) Проверьте наличие файла сообщения об ошибке {tmp} \ install.error с помощью параметра AfterInstall InnoSetup и прервите установку с надлежащим уведомлением или подтверждением (и необязательным представлением файла журнала) и выполните откат с помощью Exec (ExpandConstant ('{uninstallexe}) '), ...

4) Необходимо выполнить некоторые дополнительные шаги, такие как переопределение функции InnoSetup ShouldSkipPage (PageID: Integer), чтобы скрыть последнюю страницу, и т. Д.

...