2009-06-03 9 views
5

Tengo el siguiente escenario problemático:instalación msiexec tranquila cuando el paquete ya está instalado

Problemática Scenrio Descripción Comience ---------------------- -----

utilizo msiexec para instalar un paquete en modo silencioso de la siguiente manera:

msiexec /i c:\mypackage.msi /quiet 

Ahora tengo instalado el paquete. Digamos que entré en el comando anterior de nuevo:

msiexec /i c:\mypackage.msi /quiet 

Problemática Scenrio Descripción Fin ---------------------------

Ahora que el paquete ya está instalado, la instalación debería fallar. Pero no tengo ninguna indicación para eso.

uso la opción de registro con el fin de obtener un registro va:

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

Cuando se producen errores yo los veo en el registro, pero en el escenario representado por encima del registro de usuario está vacía. Tampoco hay nada escrito en el registro de eventos del sistema. Entonces mi pregunta es: ¿cómo puedo obtener una indicación de que la instalación (la segunda) no fue?

Notas:

no estoy dispuesto a resolver este problema escribiendo un script por lotes que comprobar si el paquete está instalado antes de la llamada a msiexec. La razón es que contradice los requisitos de implementación de nuestros clientes.

Tengo una acción personalizada de datos DLL, en el segundo tiempo, el archivo DLL no está activado, así que no puedo usar el archivo DLL para escribir el error en alguna parte.

Respuesta

1

¿Es su paquete? De ser así, ponga una condición de requisito previo que compruebe si todavía no existe algún archivo de clave o entrada de registro.

Si no es su paquete, envuélvalo en algo (otro instalador o un exe) que realizará la comprobación.

+0

Puedo probar este requisito previo – user88637

5

instalación no falla si el paquete ya está instalado, se "reconfigurado con éxito"

Con el fin de comprobar si un paquete de Windows Installer está instalado en el sistema o no, usted es mejor usar Windows SDK (no un archivo por lotes): aquí hay un script de ejemplo que itera la lista de productos instalados y desencadena MSIEXEC si aún no está instalado. (En este ejemplo se busca por su nombre, otra posibilidad es buscar por código de paquete)

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

Sé que esto es viejo hilo, pero Google llega a este y en beneficio de los demás probar este

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

Si el error , echo %errorlevel% será distinto de cero. Si llama desde arriba mediante programación utilice GetLastError()

+0

-1: En caso de error, sí. Apuesto a que sería distinto de cero incluso sin la parte 'start/wait'.El problema es que ** no hay error ** al intentar instalar un paquete que ya está instalado, y la pregunta es ** cómo detectar ese caso **. – quetzalcoatl

Cuestiones relacionadas