2009-02-24 2 views
8

Я хотел бы вызвать несколько файлов .msi в бесшумном режиме и остановить всю установку, если какой-либо сбой.msi коды возврата в Inno Setup

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

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

ответ

5

В настоящее время нет возможности проверить успешное выполнение [Run] записей. Код просто регистрирует код выхода процесса и продолжает следующую запись (его можно изучить в исходном файле Setup Inno 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] запись выполняется только тогда, когда ее опция Проверить параметр действительно возвращается истинный. Таким образом, в зависимости от ваших потребностей вы можете либо запускать все бесшумные установки один за другим, а после того, как последний закончен, выполните функцию скрипта, чтобы проверить, что все зависимости были успешно установлены; или вы можете написать функцию проверки для каждой установки зависимостей, которая затем вернет false и, таким образом, пропустит все остальные установки после первого отказа.

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

Edit: Проверьте вопрос "How do you make Inno Setup not look frozen while performing a long Exec?" где даются некоторая информация и пример сценарий связан с об использовании Exec() функции для установки зависимостей. Поэтому, если вы не используете [Run] записей, у вас есть хороший шанс достичь того, чего вы хотите.

+0

Благодаря mghie, я думаю, что это то, что я я ищу. Есть ли какие-либо крючки для отмены в разделе «Запуск»? –

+0

Извините, я отредактировал свой ответ, чтобы добавить дополнительную информацию - похоже, вы не можете делать то, что хотите, используя записи [Run]. – mghie

1

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

Ссылка выше обеспечивает полное решение, но идея folowing:

1) Написать сообщение об ошибке во временный файл {TMP} \ установить.с использованием параметра InnoSetup 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) функцию, чтобы скрыть последнюю страницу, и т.д.

+0

Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – Uriil

+0

Спасибо за примечание. Я включил общее описание идеи здесь. –