Как добавить пользовательское действие WiX, которое происходит только на удалении (через MSI)?

154
задан Community 23 May 2017 в 11:54
поделиться

3 ответа

Можно сделать это с пользовательским действием. Можно добавить ссылку на пользовательское действие под <InstallExecuteSequence>:

<InstallExecuteSequence>
...
  <Custom Action="FileCleaner" After='InstallFinalize'>
          Installed AND NOT UPGRADINGPRODUCTCODE</Custom>

Тогда необходимо будет также определить Действие под <Product>:

<Product> 
...
  <CustomAction Id='FileCleaner' BinaryKey='FileCleanerEXE' 
                ExeCommand='' Return='asyncNoWait'  />

, Где FileCleanerEXE является двоичным файлом (в моем случае немного программы C++, которая делает пользовательское действие), который также определяется под <Product>:

<Product> 
...
  <Binary Id="FileCleanerEXE" SourceFile="path\to\fileCleaner.exe" />

реальный прием к этому Installed AND NOT UPGRADINGPRODUCTCODE условие на Пользовательском действии, с, что на Вашем действии будут работать каждое обновление (так как обновление является действительно удалением, тогда переустанавливают). Который, если Вы удаляете файлы, является, вероятно, не, хотят Вас, хотят во время обновления.

На ноте стороны: Я рекомендую пройти проблему использовать что-то как программа C++, чтобы сделать действие вместо сценария пакетной обработки из-за питания и управления, которое это обеспечивает - и можно препятствовать тому "cmd быстрое" окно высвечиваться, в то время как установщик работает.

48
ответ дан Stein Åsmul 23 November 2019 в 21:58
поделиться

Самая большая проблема со сценарием пакетной обработки обрабатывает откат, когда пользователь нажимает отмену (или что-то идет не так, как надо во время Вашей установки). Корректный способ обработать этот сценарий состоит в том, чтобы создать CustomAction, который добавляет временные строки к таблице RemoveFiles. Тем путем Windows Installer обрабатывает случаи отката для Вас. Это безумно более просто, когда Вы видите решение.

Так или иначе, для имения действия только выполняются во время удаления, добавляет элемент Условия с:

REMOVE ~= "ALL"

~ = говорит, выдерживают сравнение нечувствительный к регистру (даже при том, что я думаю, что ВСЕ всегда uppercaesd). Посмотрите документация SDK MSI о Синтаксисе Условий для получения дополнительной информации.

пз: никогда не было случая, где я сел и думал, "О, пакетный файл будет хорошим решением в пакете установки". На самом деле нахождение пакета установки, который имеет пакетный файл в нем, только поощрило бы меня возвращать продукт для возмещения.

39
ответ дан Olly 23 November 2019 в 21:58
поделиться

РЕДАКТИРОВАТЬ : Возможно, посмотрите на ответ , который в данный момент находится непосредственно под .


Это тема была головной болью долгое время. Я наконец-то понял. В Интернете есть несколько решений, но ни одно из них не работает. И, конечно, нет документации. Поэтому в приведенной ниже таблице есть несколько свойств, которые предлагается использовать, и значения, которые они имеют для различных сценариев установки:

alt text

Поэтому в моем случае я хотел, чтобы ЦС работал только при деинсталляциях, а не при обновлении, не исправлении или изменении. В соответствии с таблицей выше я должен был использовать

<Custom Action='CA_ID' Before='other_CA_ID'>
        (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>

И это сработало!

184
ответ дан crazysim 23 November 2019 в 21:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: