WIX: запуск настраиваемого действия в зависимости от успеха ранее выполненного настраиваемого действия - PullRequest
2 голосов
/ 08 июня 2011

У меня есть необходимость перезапустить процесс Windows Explorer во время установки. В настоящее время мы вынуждаем пользователя перезагрузиться, чтобы убедиться, что процесс Explorer действительно перезапущен, но я бы хотел быть более гибким.

У меня есть исполняемый файл restartexplorer, который я могу вызвать во время установки. Я хотел бы вызвать исполняемый файл restartexplorer и использовать ScheduleReboot, только если пользовательское действие restart explorer возвращает код ошибки.

Я, наверное, определю что-то вроде этого:

<CustomAction Id='RestartProperty' Property='QtExecCmdLine'
    Value='"[INSTALLDIR]RestartExplorer.exe"' />
<CustomAction Id='Restart' BinaryKey='WixCA' DllEntry='CAQuietExec' Execute="immediate" Return="check" />

Тогда InstallExecuteSequence будет выглядеть примерно так:

<InstallExecuteSequence>
    ...
    <Custom Action="RestartProperty" Before="Restart">PREVIOUSVERSIONSINSTALLED</Custom>
    <Custom Action="Restart" After="SomeAction">PREVIOUSVERSIONSINSTALLED</Custom>
    <ScheduleReboot After="Restart"><![CDATA[(NOT Installed) AND (SomeErrorValue > 0)]]></ScheduleReboot>
</InstallExecuteSequence>

Вопрос в том, как получить код ошибки из предыдущего пользовательского действия? Могу ли я использовать QtExecCmdLine и по-прежнему иметь возможность проверять код ошибки, или мне нужно непосредственно выполнять исполняемый файл из тега настраиваемого действия? Это должно работать на Windows XP SP3 и новее, и я бы предпочел решение, которое не должно отличаться в зависимости от версии ОС.

1 Ответ

1 голос
/ 08 июня 2011

Вы можете создать пользовательское действие сценария VB, которое будет выполнять следующие действия:

  1. Запустить RestartExplorer.exe
  2. Если это не удалось, задайте какое-либо глобальное свойство (например, EXPLORER_RESTART_FAILED = 1)

Затем используйте ShaduleReboot, если EXPLORER_RESTART_FAILED равен 1.

...