2017-01-14 4 views
1

Я создал установщик MSI с использованием Installshield 2014. При запуске его из пользовательского интерфейса все работает нормально, но когда я запускаю его в бесшумном режиме, используя команду ниже, то мои пользовательские действия не стрелять вообще:Как запустить пользовательские действия при запуске установщика MSI в бесшумном режиме

C:\>msiexec /i "myApplication.msi" /qn WEBURL=http://localhost/mywebapp /log out.txt 

WEBURL является собственностью требует настраиваемого действия. Значение WEBURL передается в библиотечный метод класса C# в качестве аргумента. Метод C# вызывается моим настраиваемым действием, которое вызывается, когда я нажимаю кнопку «Установить» при запуске мастера установки. Мое пользовательское действие выполняется всегда, т. Е. Я сохранил условие для выполнения пользовательского действия как 1, что означает, что он выполняется при любых обстоятельствах.

В файле журнала я также вижу, что значение свойства WEBURL правильно установлено. Я не могу понять, что останавливает мое действие для запуска при запуске установщика в бесшумном режиме?

Обновление: Как было предложено Майклом, после ввода пользовательского действия в InstallExecuteSequence оно начинает выполняться в бесшумном режиме. Но теперь проблема в том, что он начинает получать выполнение дважды в режиме пользовательского интерфейса, поскольку одно и то же действие уже выполняется через кнопку, щелкнув по одному из диалогов, которое появляется во время InstallUISequence. Поэтому я хочу выполнить свое пользовательское действие, поместив его в InstallExecuteSequence только тогда, когда я запускаю установщик в бесшумном режиме (чтобы он выполнялся только один раз, если я в режиме пользовательского интерфейса).

ответ

1

При запуске с /qn мастер не отображается. Даже весь InstallUISequence пропущен. Поэтому, если вы хотите, чтобы ваше действие всегда запускалось, вы не должны вызывать его только нажатием кнопки. Когда кнопка не отображается, ее нельзя нажать.

Вместо этого найдите место в InstallExecuteSequence, чтобы запланировать его. (Если у вас нет других требований, вы, вероятно, все же хотите запланировать его когда-нибудь после CostFinalize, чтобы отразить несимвольный случай.) В этом расписании будет выполняться действие независимо от того, есть ли у вас интерфейс.

Однако он также запускает его независимо от того, устанавливаете или удаляете его, поэтому либо изменяйте свое условие, либо свое действие, чтобы принять это во внимание. Самый простой подход может проверить, установлено ли свойство Installed; более надежная проверка может проверить состояние установки и действия соответствующего компонента. Последнее может быть необходимо, если вам необходимо условно сделать что-то в сценариях обслуживания, которые добавляют или удаляют функцию.

Поскольку вы упоминаете, что вам также нужно его запустить во время пользовательского интерфейса, вам нужно предпринять дополнительные шаги. Возможно, вы сможете установить опцию планирования msidbCustomActionTypeFirstSequence, как показано ниже.

enter image description here

Или вы, возможно, придется определять сценарий, например, путем проверки UILevel, или путем установления и проверки собственной недвижимости при выполнении ваших действий. Возможно, вам также понадобится разбить его на несколько точек входа, чтобы вы могли сообщать пользовательскому интерфейсу от немедленного выполнения; не существует RunMode, который отличает их. (Я забываю свойство, которое устанавливается?)

+0

Если я поместил свое пользовательское действие в последовательность «InstallExecute», тогда он будет работать как в пользовательском интерфейсе, так и в бесшумном режиме. В режиме пользовательского интерфейса он запускается дважды, один из одного из диалоговых окон пользовательского интерфейса и другой из последовательности «InstallExecute». Я не могу удалить его из диалогового окна пользовательского интерфейса, поскольку мне, возможно, придется его запускать несколько раз на основе некоторых проверок пользовательского интерфейса. Как я могу убедиться, что даже если я добавлю пользовательское действие в последовательность «InstallExecute», тогда он запускает * только * в бесшумном режиме. – RBT

+0

@ RBT: Я обновил свой ответ, чтобы поговорить о FirstSequence и UILevel как опции для выполнения только в одной последовательности. –

+0

Пользовательский вариант «Планирование действий» сделал трюк для меня. Все мои пользовательские действия были запланированы как «Всегда исполнять». В тот момент, когда я изменил его на «Выполнение только один раз», он начал работать в соответствии с моим ожиданием. Я считаю, что 'UILevel' тоже может быть уместным в моем сценарии, но мы поддерживаем * только * два режима в нашем установщике' INSTALLUILEVEL_FULL' и 'INSTALLUILEVEL_NONE'. Я бы использовал его, если бы мне нужен этот уровень контроля при выполнении моих пользовательских действий. Я также добавил экранный снимок, чтобы продемонстрировать изменения в расписании выполнения в вашем сообщении, поскольку это поможет читателям. Спасибо за последующие действия. – RBT

Смежные вопросы