Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Проверьте Документацию MSDN в таблице обновления, в основном вам нужно установить бит msidbUpgradeAttributesVersionMaxInclusive.

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

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

Обратите внимание: вместо того, чтобы помнить код пакета (реальная боль, если вы используете автоматически сгенерированные коды пакетов с непрерывной интеграцией), следующий 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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

  • script от saschabeaumont действительно короткий и приятный. Что он делает, заключается в том, чтобы убедиться, что вы действительно используете правильный ProductCode. Главная потребность в том, что она должна меняться каждый раз, вы производите крупное обновление... В вашем случае: Это решает только один сценарий, почему ваша деинсталляция могла быть неудачной...