Как запускать пользовательские действия при запуске установщика MSI в автоматическом режиме
Я создал установщик MSI с помощью Installshield 2014. При запуске из пользовательского интерфейса все работает нормально, но когда я запускаю его в режиме без вывода сообщений с помощью команды ниже, мои пользовательские действия вообще не запускаются:
C:\>msiexec /i "myApplication.msi" /qn WEBURL=http://localhost/mywebapp /log out.txt
WEBURL
это свойство, требуемое пользовательским действием. Ценность WEBURL
передается методу библиотеки классов C# в качестве аргумента. Метод C# вызывается моим настраиваемым действием, которое вызывается, когда я нажимаю кнопку "Установить" на шаге мастера установки. Мое пользовательское действие выполняется всегда, т.е. я сохранил условие для выполнения пользовательского действия как 1
что означает, что он выполняется при любых обстоятельствах.
В файле журнала я также вижу значение WEBURL
свойство становится правильно установленным. Я не могу понять, что останавливает мое настраиваемое действие при запуске установщика в автоматическом режиме?
Обновление: как предложено Майклом, после помещения настраиваемого действия в InstallExecuteSequence
он начинает выполняться в беззвучном режиме. Но теперь проблема в том, что он начинает выполняться дважды в режиме пользовательского интерфейса, так как то же действие уже выполнялось с помощью нажатия кнопки в одном из диалоговых окон, который появляется во время InstallUISequence
, Поэтому я хочу выполнить свое пользовательское действие, поместив его в InstallExecuteSequence
только когда я запускаю установщик в режиме без вывода сообщений (чтобы он выполнялся только один раз, если я в режиме пользовательского интерфейса).
1 ответ
Когда вы бежите с /qn
Мастер не отображается. Даже вся последовательность InstallUIS пропускается. Поэтому, если вы хотите, чтобы ваше действие всегда выполнялось, вы не должны вызывать его только одним нажатием кнопки. Когда кнопка не отображается, ее нельзя нажать.
Вместо этого найдите место в InstallExecuteSequence, чтобы запланировать его. (Если у вас нет других требований, вы, вероятно, все равно захотите запланировать это через некоторое время после CostFinalize, чтобы отразить случай без вывода сообщений.) Это планирование запустит действие независимо от того, есть ли у вас пользовательский интерфейс.
Однако он также запускается независимо от того, устанавливаете ли вы или удаляете, поэтому либо измените свое состояние, либо свои действия, чтобы принять это во внимание. Самый простой подход может проверить, является ли Installed
свойство установлено; более надежная проверка может проверить состояние установки и действия соответствующего компонента. Последнее может быть необходимо, если вам необходимо сделать что-то в сценариях обслуживания, которые добавляют или удаляют функцию.
Поскольку вы упомянули, что он также необходим для запуска во время пользовательского интерфейса, вам необходимо предпринять дополнительные шаги. Вы можете установить опцию планирования msidbCustomActionTypeFirstSequence, как показано ниже.
Либо вам, возможно, придется определить сценарий, например, проверив UILevel, либо установив и проверив собственное свойство во время выполнения вашего действия. Вам также может понадобиться разделить его на несколько точек входа, чтобы вы могли отличить интерфейс от немедленного выполнения; не существует RunMode, который бы отличал их. (Я забыл свойство, которое устанавливается?)