MSI Install échoue car "une autre version de ce produit est déjà installée"

nous installons une application (MSI) en utilisant MSIEXEC avec l'option de ligne de commande suivante:

MsiExec.exe /x{code} /qn /liwearucmopvx+ C:LogUnInstall.tra
MsiExec.exe /iC:SourceApp.msi /qn TARGETDIR=C:Install ALLUSERS=1 /liwearucmopvx+ %C:LogInstall.tra

la plupart du temps cela fonctionne, mais parfois la désinstallation échoue (pas sûr pourquoi encore, en regardant dans l'erreur). De toute façon, lorsque cela se produit, j'obtiens l'erreur suivante lors de la réinstallation:

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

Est-il un moyen de contourner cela? Sens pour s'assurer que nous avons toujours re-installer (si elle existe, nous pouvons simplement automatiquement l'emporter?)

12
demandé sur Cody Gray 2010-10-19 21:13:45

3 réponses

découvrez le documentation MSDN sur la table de mise à niveau, en gros vous devez définir le msidbUpgradeAttributesVersionMaxinclusive bit.

vous n'indiquez pas ce que vous utilisez pour construire votre installateur, si vous utilisez WiX 3.5 ou tard, vous pouvez utiliser MajorUpgrade/@AllowSameVersionUpgrades="yes" pour prendre soin de cela pour vous.

notez que parce que MSI ne tient pas compte de la quatrième version du produit de champ, réglage de la cet attribut permet aussi oui déclassement lorsque les trois premiers les champs de la version du produit sont identiques. Par exemple, la version 1.0.0.1 du produit va" mettre à niveau " 1.0.0.2998 parce que ils sont vus comme la même version (1.0.0). Qui pourrait réintroduire sérieux bugs donc le choix le plus sûr est pour changer les trois premières versions champs et omettre cet attribut pour obtenir la valeur par défaut de pas de.

notez qu'au lieu d'avoir à se souvenir du code du paquet (une vraie douleur si vous utilisez des codes de paquet générés automatiquement avec Intégration continue) le VBScript suivant supprimera le paquet de nom en cherchant la liste des produits installés et en trouvant le code du paquet lui-même.

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
8
répondu saschabeaumont 2014-09-24 22:42:34

si la désinstallation échoue, le produit sera toujours enregistré sur le système - selon l'endroit où l'échec se produit, la désinstallation se retournera, laissant le produit encore installé.

si vous essayez de réinstaller un produit avec le même code produit mais une version différente en plus d'une installation existante, MSI se plaindra, à juste titre, que le produit est toujours installé. Si vous souhaitez obtenir une mise à niveau comportement, alors vous devez changer le code produit et écrire les entrées dans la table de mise à niveau de sorte que MSI puisse faire la distinction entre les anciens et les nouveaux produits et utiliser L'action RemoveExistingProducts pour supprimer l'ancien produit avant ou après que la nouvelle version soit établie.

si vous voulez comprendre pourquoi la désinstallation a échoué, vous devez regarder les journaux, généralement rechercher 'valeur de retour 3' qui est la signature d'une action d'installation échouée.

0
répondu Stephen Connolly 2011-04-11 22:20:14

la question est plus ancienne, mais les réponses existantes manquent l'essence du problème et de la solution alors qu'elles sont utiles pour d'autres scénarios:

  1. Si la désinstallation échoue, vous avez un sérieux problème, et il n'y a pas de meilleur moyen que l'analyse de ce- sinon, vous pourriez avoir plus de difficulté plus tard.

  2. au moins, j'écrirais un petit script / programme, qui utilise la valeur de retour de la désinstallation ou, encore plus puissant, teste, si le MSI est encore installé - avant d'essayer d'installer le nouveau MSI.

    Je donnerais plus d'informations comment faire, si il y a un intérêt à cela, mais il est déjà de l'information sur d'autres questions.

  3. quelques autres réponses recommandent, que vous utilisiez des mises à niveau majeures (chaque nouvelle construction peut/doit être une mise à niveau majeure correcte dans ce scénario, au moins comme une recommandation). C'est une bonne recommandation, mais n'aide pas, si les désinstallations échouent "parfois". De plus, il est important de préciser que le plus souvent, l'erreur que vous mentionnez, montre que vous n'utilisez pas déjà des mises à niveau majeures. Si vous avez vraiment un problème avec désinstallation, alors une mise à niveau majeure pourrait augmenter les problèmes, parce que dépendant de la configuration, il peut installer le produit une deuxième fois MSI-sage et vous avez deux références MSI sur ce, ce qui est encore un produit pour vous. Plus de détails conduirait trop loin. Rappelez-vous juste, un (Toujours) travail désinstaller ou au moins un test pour cela doit être assuré avant d'autres étapes de mise à jour.

  4. le script de saschabeaumont est vraiment court et agréable. Ce qu'il fait, c'est de s'assurer que vous utilisez vraiment le bon Code produit. Le principal besoin est, parce qu'il doit changer à chaque fois, vous produisez une mise à niveau majeure... Dans votre cas: cela résout un seul scénario, pourquoi votre désinstallation pourrait avoir échoué...

0
répondu Philm 2014-09-17 08:52:10