MSI Install Fails, потому что "Другая версия этого продукта уже установлена"

Мы устанавливаем приложение (MSI) с использованием MSIEXEC со следующей опцией командной строки:

MsiExec.exe /x{code} /qn /liwearucmopvx+ C:\Log\UnInstall.tra
MsiExec.exe /iC:\Source\App.msi /qn TARGETDIR=C:\Install ALLUSERS=1 /liwearucmopvx+ %C:\Log\Install.tra

В большинстве случаев это работает, но иногда происходит сбой при удалении (не знаю, почему, глядя на ошибку). В любом случае, когда это происходит, я получаю следующую ошибку при переустановке:

Another version of this product is already installed.  Installation of this version cannot continue.  To configure or remove the existing version of this product, use Add/Remove Programs on the Control Panel

Есть ли способ обойти это? Имеется в виду, чтобы мы всегда переустанавливали (если он существует, мы можем просто автоматически его удалить?)

3 ответа

Ознакомьтесь с документацией MSDN в таблице обновлений, в основном вам необходимо установить бит msidbUpgradeAttributesVersionMaxInclusive.

Вы не указываете, что вы используете для создания вашего установщика, если вы используете WiX 3.5 или более позднюю версию, вы можете использовать MajorUpgrade/@AllowSameVersionUpgrades="yes" позаботиться об этом для вас.

Обратите внимание, что, поскольку MSI игнорирует четвертое поле версии продукта, установка этого атрибута на да также позволяет понизить рейтинг, если первые три поля версии продукта идентичны. Например, версия продукта 1.0.0.1 будет "обновлена" до версии 1.0.0.2998, поскольку они рассматриваются как одна и та же версия (1.0.0). Это может привести к серьезным ошибкам, поэтому самый безопасный выбор - изменить первые три поля версии и пропустить этот атрибут, чтобы получить значение по умолчанию - no.

Обратите внимание, что вместо того, чтобы запоминать код пакета (реальная боль, если вы используете автоматически сгенерированные коды пакетов с непрерывной интеграцией), следующий VBScript удалит пакет по имени, выполнив поиск в списке установленных продуктов и найдя сам код пакета.,

Option Explicit
Dim productName, productCode, installer 
productName = "My Application"

Set installer = Wscript.CreateObject("WindowsInstaller.Installer")

For Each productCode In installer.Products
    If InStr(1, LCase(installer.ProductInfo(productCode, "ProductName")), LCase(productName)) Then Exit For
Next

If Not IsEmpty(productCode) Then    
    Dim WshShell, oExec
    Set WshShell = CreateObject("WScript.Shell")
    Set oExec = WshShell.Exec("msiexec /x " & productCode & " /qb /l*v ""%temp%\UninstallApp.log"" ")
End If

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

  1. Если удаление завершится неудачно, у вас возникнет серьезная проблема, и нет лучшего способа, чем проанализировать это, иначе вы можете столкнуться с большими проблемами позже.

  2. По крайней мере, я написал бы небольшой скрипт / программу, которая использует возвращаемое значение деинсталляции или, что еще более важно, тесты, если MSI все еще установлен - ДО того, как вы попытаетесь установить новый MSI.
    Я бы дал больше информации, как это сделать, если есть интерес к этому, но уже есть информация о SO в других вопросах.

  3. В некоторых других ответах рекомендуется использовать Major Upgrades (каждая новая сборка может / должна быть правильной Major Upgrade в этом сценарии, по крайней мере, в качестве рекомендации). Это хорошая рекомендация, но она не помогает, если при удалении происходит "иногда". Более того, важно отметить, что чаще всего упоминаемая вами ошибка показывает, что вы уже не используете Major Upgrades. Если у вас действительно есть проблема с деинсталляциями, то серьезное обновление может увеличить проблемы, потому что, в зависимости от конфигурации, он может установить продукт во второй раз с MSI, и у вас есть две ссылки на MSI, что по-прежнему является одним продуктом для вы. Более подробная информация приведет слишком далеко. Просто помните, что (всегда) работающее удаление или, по крайней мере, тест для этого должен быть гарантирован перед дальнейшими шагами обновления.

  4. Сценарий от saschabeaumont очень короткий и красивый. То, что он делает, это чтобы убедиться, что вы действительно используете правильный код продукта. Основная необходимость заключается в том, что, поскольку он должен меняться каждый раз, когда вы производите серьезное обновление... В вашем случае: это решает только ОДИН сценарий, почему ваша деинсталляция могла быть неудачной...

Если удаление завершится неудачно, продукт все равно будет зарегистрирован в системе - в зависимости от того, где произошел сбой, удаление будет отменено, и продукт останется установленным.

Если вы попытаетесь переустановить продукт с тем же кодом продукта, но другой версией поверх существующей установки, MSI справедливо скажет, что продукт все еще установлен. Если вы хотите добиться поведения при обновлении, вам нужно изменить код продукта и записать записи в таблицу обновлений, чтобы MSI могла различать старый и новый продукты и использовать действие RemoveExistingProducts, чтобы удалить старый продукт до или после появления новой версии. лег.

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

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