MSI Install Fails, потому что "Другая версия этого продукта уже установлена" - PullRequest
13 голосов
/ 19 октября 2010

Мы устанавливаем приложение (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 ]

8 голосов
/ 14 апреля 2011

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

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

Обратите внимание, что поскольку MSI игнорирует четвертуюполе версии продукта, если для этого атрибута установлено значение yes, также допускается понижение рейтинга, если первые три поля версии продукта идентичны.Например, версия продукта 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
0 голосов
/ 17 сентября 2014

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

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

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

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

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

0 голосов
/ 12 апреля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...