Я хотел бы изменить установщик MSI (созданный через WiX ), чтобы удалить весь каталог при удалении.
Я понимаю параметры RemoveFile
и RemoveFolder
в WiX, но они недостаточно надежны, чтобы рекурсивно удалить всю папку, содержимое которой было создано после установки.
Я заметил похожий вопрос переполнения стека Удаление файлов при удалении WiX , но мне было интересно, можно ли это сделать проще, используя вызов пакетного сценария для удаления папки.
Это мой первый раз, когда я использую WiX, и я все еще изучаю пользовательские действия . Что будет основным примером настраиваемого действия, которое будет запускать пакетный скрипт при удалении?
источник
Есть много проблем с ответом yaluna , также имена свойств чувствительны к регистру,
Installed
это правильное написание (INSTALLED
не будет работать). Таблица выше должна была быть такой:Также при условии полного восстановления и удаления фактические значения свойств могут быть:
Документация по синтаксису выражений WiX гласит:
Свойства задокументированы в Руководстве по установке Windows (например, Установлено )
РЕДАКТИРОВАТЬ: небольшая коррекция к первой таблице; очевидно, «удаление» может произойти и с
REMOVE
самим собойTrue
.источник
Вы можете сделать это с помощью специального действия. Вы можете добавить ссылку на свое пользовательское действие в разделе
<InstallExecuteSequence>
:Тогда вам также нужно будет определить свое действие в разделе
<Product>
:Где FileCleanerEXE - это двоичный файл (в моем случае это небольшая программа на С ++, выполняющая пользовательское действие), которая также определяется в разделе
<Product>
:Реальная хитрость в этом заключается в
Installed AND NOT UPGRADINGPRODUCTCODE
условии настраиваемого действия, при котором ваше действие будет запускаться при каждом обновлении (поскольку обновление действительно является деинсталляцией, а затем переустановите). Что, если вы удаляете файлы, вероятно, не хотите, чтобы вы хотели во время обновления.С другой стороны: я рекомендую решить проблему с использованием чего-то вроде программы на C ++ для выполнения действия вместо пакетного скрипта из-за его мощности и контроля - и вы можете предотвратить мигание окна «cmd prompt» во время Ваш установщик работает.
источник
CustomAction
будет выполнено "After = 'InstallFinalize'". На этом этапе все файлы удаляются из папки установки. Также файл Cleaner.exe. Таким образом, вы не можете выполнить его через CustomAction. Этот ответ просто неправильный. Мне интересно про 42 голоса!Самая большая проблема с пакетным скриптом - обработка отката, когда пользователь нажимает кнопку отмены (или что-то идет не так во время вашей установки). Правильный способ обработки этого сценария - создать CustomAction, который добавляет временные строки в таблицу RemoveFiles. Таким образом, установщик Windows обрабатывает случаи отката для вас. Это безумно проще, когда вы видите решение.
В любом случае, чтобы действие выполнялось только во время удаления, добавьте элемент Condition с помощью:
~ = говорит, что сравнивать без учета регистра (хотя я думаю, что ALL всегда uppercaesd). См. Документацию MSI SDK о синтаксисе условий для получения дополнительной информации.
PS: Никогда не было случая, чтобы я сел и подумал: «О, пакетный файл был бы хорошим решением в установочном пакете». На самом деле, поиск установочного пакета, в котором есть пакетный файл, только побудил бы меня вернуть продукт за возмещение.
источник
Вот набор свойств, которые я сделал, которые более интуитивно понятны, чем встроенные. Условия основаны на таблице истинности, представленной выше ahmd0.
Вот пример использования:
Вопросы:
источник
Я использовал Custom Action, отдельно закодированный в C ++ DLL, и использовал DLL для вызова соответствующей функции при деинсталляции, используя этот синтаксис:
Используя приведенный выше блок кода, я смог запустить любую функцию, определенную в C ++ DLL, при удалении. К вашему сведению, моя функция удаления имела код, касающийся очистки текущих пользовательских данных и записей реестра.
источник