2009-06-03 16 views
5

Ho il seguente scenario problematico:installazione msiexec tranquillo quando il pacchetto è già installato

problematico Scenrio Descrizione Begin ---------------------- -----

io uso msiexec per installare un pacchetto in modalità non interattiva nel modo seguente:

msiexec /i c:\mypackage.msi /quiet 

Ora ho il pacchetto installato. Diciamo che ho inserito il comando sopra ancora:

msiexec /i c:\mypackage.msi /quiet 

problematico Scenrio Descrizione Fine ---------------------------

Ora dal momento che il pacchetto è già installato, l'installazione dovrebbe fallire. Ma non ho indicazioni per questo.

si utilizza l'opzione di registro al fine di ottenere un log in corso:

msiexec /i c:\mypackage.msi /quiet /l* log.txt 

Quando si verificano errori io non li vedo nel registro, ma nello scenario descritto sopra il registro è vuoto. Inoltre non è stato scritto nulla nel registro eventi di sistema. Quindi la mia domanda è: come posso ottenere un'indicazione che l'installazione (la seconda) non è andata?

Note:

io non sono disposto a risolvere questo problema scrivendo uno script batch che controllerà se il pacchetto è stato installato prima della chiamata a msiexec. Il motivo è che contraddice i requisiti di implementazione dei nostri clienti.

I dati di azione personalizzati DLL, nel secondo tempo, la DLL non è attivata, quindi non posso utilizzare la DLL per scrivere l'errore da qualche parte.

risposta

1

È il tuo pacchetto? In tal caso, inserire una condizione di prerequisito che controlli se alcuni file chiave o voci di registro non esistono ancora.

Se non è il vostro pacchetto, avvolgetelo in qualcosa (un altro programma di installazione o un exe) che effettuerà il controllo.

+0

Posso provare questa cosa prerequisito – user88637

5

installazione non fallisce se il pacchetto è già installato, è stato "riconfigurato con successo"

Al fine di verificare se un pacchetto Windows Installer è installato sul sistema o no, siete meglio usare Windows SDK (non un file batch) - ecco uno script di esempio che itera l'elenco dei prodotti installati e attiva MSIEXEC se non è già installato. (Questo esempio ricerca per nome, in alternativa si può cercare per codice di pacchetto)

Option Explicit 

Dim productName:productName = "My Awesome Product" 

Dim installer : Set installer = Nothing 
Set installer = Wscript.CreateObject("WindowsInstaller.Installer") 

Dim productCode, property, value, message 

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

If IsEmpty(productCode) Then 
    Dim WshShell, oExec 
    Set WshShell = CreateObject("WScript.Shell") 
    WshShell.Exec("msiexec /i mypackage.msi /qb") 
Else 
    Wscript.Echo productName & " is already installed." 
    Wscript.Quit 2 
End If 
0

So che questo è vecchio thread, ma google colpisce questo in su e in beneficio degli altri provate questo

start /wait msiexec /i c:\mypackage.msi /quiet 

Se l'errore , echo %errorlevel% sarà diverso da zero. Se si chiama in precedenza a livello di programmazione, utilizzare GetLastError()

+0

-1: On error - yes. Scommetto che sarebbe diverso da zero anche senza la parte 'start/wait'.Il problema è che non ci sono ** errori ** nel tentativo di installare un pacchetto che è già installato, e la domanda è ** come rilevare quel caso **. – quetzalcoatl

Problemi correlati