2010-10-19 13 views
12

Abbiamo installare un'applicazione (MSI) utilizzando MSIEXEC con la seguente opzione riga di comando:MSI Install fallisce perché "Un'altra versione di questo prodotto è già installata"

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 

Il più delle volte questo funziona, ma a volte il la disinstallazione fallisce (non sono sicuro del perché ancora, esaminando l'errore). In ogni modo, quando questo accade ricevo il seguente errore durante la reinstallazione:

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 

C'è un modo per aggirare questo? Significa assicurarci di reinstallarlo sempre (se esiste, possiamo semplicemente soffiarlo automaticamente?)

+0

State facendo il programma MsiExec? O questa domanda appartiene da qualche altra parte ;-) –

+0

Non sei sicuro di cosa intendi con "renderlo programma"? – Shaitan00

+0

stackoverflow come il nome (forse) implica è un sito di programmatore, AFAIK. –

risposta

0

Se la disinstallazione non riesce, il prodotto sarà ancora registrato sul sistema - a seconda di dove si verifica l'errore, la disinstallazione verrà ripristinata , lasciando il prodotto ancora installato.

Se si tenta di reinstallare un prodotto con lo stesso codice prodotto ma una versione diversa su un'installazione esistente, MSI lamenterà, giustamente, che il prodotto è ancora installato. Se si desidera ottenere un comportamento di aggiornamento, è necessario modificare il codice del prodotto e scrivere le voci nella tabella di aggiornamento in modo che MSI possa discriminare tra vecchi e nuovi prodotti e utilizzare l'azione RemoveExistingProducts per rimuovere il vecchio prodotto prima o dopo la versione più recente. stabilito.

Se si desidera comprendere il motivo per cui la disinstallazione non è riuscita, è necessario esaminare i registri, in genere cercare 'valore restituito 3' che è la firma di un'azione di installazione non riuscita.

8

Verificare il MSDN Documentation on the Upgrade Table, in pratica è necessario impostare il msidbUpgradeAttributesVersionMaxInclusive bit.

Non si indica cosa si sta utilizzando per creare il proprio programma di installazione, se si utilizza WiX 3.5 o successivo è possibile utilizzare MajorUpgrade/@AllowSameVersionUpgrades="yes" per prendersi cura di questo per voi.

Note that because MSI ignores the fourth product version field, setting this attribute to yes also allows downgrades when the first three product version fields are identical. For example, product version 1.0.0.1 will "upgrade" 1.0.0.2998 because they're seen as the same version (1.0.0). That could reintroduce serious bugs so the safest choice is to change the first three version fields and omit this attribute to get the default of no.

Nota che, invece di dover ricordare il codice di pacchetto (un vero e proprio dolore se si sta utilizzando codici degli imballaggi auto-generate con Continuous Integration) il seguente VBScript rimuoverà il pacchetto nome cercando la lista dei prodotti installati e trovare il codice del pacchetto stesso.

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

Questa impostazione ha reso il mio test di installazione in grado di risolvere se stesso in modo che potessi disinstallarlo con successo. –

0

La domanda è piuttosto vecchio, ma le risposte esistenti sono manca l'essenza del problema e la soluzione, mentre utile per altri scenari:

  1. Se la disinstallazione non riesce, avete un problema serio e non c'è modo migliore di analizzare questo - altrimenti potresti ottenere più tardi in seguito.

  2. Almeno, vorrei scrivere un piccolo script/programma, che utilizza il valore restituito della disinstallazione o, ancora più potente, i test, se l'MSI è ancora installato, PRIMA di provare a installare il nuovo MSI.
    Vorrei fornire maggiori informazioni su come farlo, se vi è interesse in questo, ma ci sono già informazioni su SO in altre domande.

  3. Altre risposte consigliano di utilizzare gli aggiornamenti principali (ogni nuova build può/dovrebbe essere un aggiornamento principale corretto in questo scenario, almeno come raccomandazione). Questa è una buona raccomandazione, ma non aiuta, se la disinstallazione "non funziona" a volte ". Inoltre, è importante specificare che, molto spesso, l'errore che si menziona mostra che non si sta già utilizzando Major Upgrades. Se si ha davvero un problema con la disinstallazione, un aggiornamento principale potrebbe aumentare i problemi, perché dipende dalla configurazione, può installare il prodotto una seconda volta MSI-saggio e si dispone di due riferimenti MSI su ciò, ciò che è ancora un prodotto per te. Maggiori dettagli porteranno troppo lontano. Ricorda solo che una disinstallazione (sempre) funzionante o almeno un test per questo deve essere assicurata prima di ulteriori passaggi di aggiornamento.

  4. La sceneggiatura di saschabeaumont è davvero breve e piacevole. Quello che sta facendo è assicurarti che stai usando il ProductCode corretto. L'esigenza principale è, perché deve cambiare ogni volta, si produrrà un importante aggiornamento ... Nel tuo caso: Questo risolve un solo scenario, perché la tua disinstallazione avrebbe potuto non ...