WIX: запуск пользовательского действия на основе успеха ранее выполненного пользовательского действия.

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

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

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

<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 и новее, и я бы предпочел решение, которое не должно было отличаться в зависимости от версии ОС.


person tronda    schedule 08.06.2011    source источник


Ответы (1)


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

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

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

person gtikok    schedule 08.06.2011
comment
Возможное решение однозначно. Невозможно, если я использую встроенный QtExecCmdLine? - person tronda; 08.06.2011
comment
Честно говоря, я не использовал QtExecCmdLine. Но я считаю, что он может запускать VB Script так же, как и exe. - person gtikok; 08.06.2011