Как удалить предыдущую версию в рамках установки MSI?

У меня есть продукт, который упакован как MSI. Когда мои клиенты устанавливают новую версию моего продукта поверх существующей версии, она не работает должным образом из-за пользовательского действия VBS, как описано ниже. У меня вопрос: как я могу изменить свой MSI, чтобы при установке поверх программы всегда выполнялась полная деинсталляция любой существующей версии?

Деталь:

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

Программа установки msi создает и записывает некоторые файлы в папку [CommonApplicationData] \ MyApp. Во время выполнения приложение создает дополнительные файлы в папке [CommonApplicationData] \ MyApp. Во время удаления мне нужно удалить все эти файлы. Поскольку они не устанавливаются MSI, они не удаляются автоматически, поэтому я создал скрипт VBS, который удаляет эту папку и все остальное в ней. Я положил команду для выполнения этого VBS в ExecuteDeferred:

...
RemoveFiles
RemoveFolders
CreateFolders
MoveFiles
InstallFiles
PatchFiles
If REMOVE="ALL" Then
    REM line below is my custom script
    call VBScript From Installation (MyApp_UninstallCleanup)  
End
DuplicateFiles
BindImage
CreateShortcuts
...

Пока все хорошо, и работает нормально при установке и удалении. Однако, если я устанавливаю новую версию своего продукта поверх существующей версии, кажется, что все происходит в следующем порядке: a) установить новую версию, создавая различные файлы в папке [CommonApplicationData] \ MyApp и в [Program Files] \ MyApp..., перезаписывая файлы старой версии b) запустите мои VBS, удалив папку [CommonApplicationData] \ MyApp

У меня есть GUID для старых версий, перечисленных в таблице обновлений в моем новом MSI, и кроме этого пользовательского сценария процесс обновления, кажется, работает нормально.

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

Есть ли способ изменить мой новый MSI, чтобы он сначала удалил предыдущие версии?

Примечательно, что у меня есть много компаний, у которых установлена ​​существующая версия MSI, которая содержит пользовательские VBS. Таким образом, решение действительно должно быть таким, которое может справиться с существующей установленной MSI.

Я использовал Wise Installation Express 7.0 для создания MSI.

Спасибо!!

(кросс-пост здесь)

2 ответа

Решение

График RemoveExistingProducts действие до InstallInitialize действие:

В этом случае программа установки полностью удаляет старые приложения перед установкой новых приложений. Это неэффективное размещение для действия, потому что все повторно используемые файлы должны быть повторно скопированы.

Ответ от EdT на форумах Symantec

Если вы использовали стандартный шаблон Wise для ваших установок, то действие RemoveExistingProducts будет выполнено в конце последовательности InstallExecute. Хотя технически это наиболее "эффективное" размещение, если вы не очень тщательно запустили UpgradeSync при создании нового пакета для обновления старого, конечным результатом обычно является один из отсутствующих файлов или других аберраций.

Исправление заключается в том, чтобы повторно выполнить действие RemoveExistingProducts, чтобы оно выполнялось между InstallValidate и InstallInitialize. Это гарантирует, что старое приложение будет полностью удалено перед установкой новой версии.

Посмотрите "RemoveExistingProducts" в файле справки MSI.CHM для более подробного объяснения вариантов позиционирования этого действия.

Другие вопросы по тегам