2009-02-24 8 views
8

Me gustaría llamar a varios archivos .msi en modo silencioso, y detener toda la instalación si alguno falla.msi códigos de retorno en la configuración de Inno

¿Es posible obtener los códigos de retorno de msiexec.exe llamando desde la sección [ejecutar]?

Actualmente solo puedo ver los mensajes de error en el visor de eventos de Windows.

Respuesta

5

Actualmente no hay forma de verificar la ejecución exitosa de las entradas [Ejecutar]. El código simplemente registra el código de salida del proceso y continúa con la siguiente entrada (puede examinarse en el archivo fuente Inno Setup Main.pas, la función es ProcessRunEntry(), comenzando en la línea 3404 en la versión actual 5.2. 3).

Si necesita asegurarse de que todas las ejecuciones de msiexec fueron exitosas, necesitará codificar una capa intermedia. Esto puede ser tan simple como un pequeño apéndice que se ejecuta en las entradas [Ejecutar] e inicia msiexec.exe con los parámetros correctos, espera a que el proceso finalice y luego escribe el código de retorno en un archivo.

Otra forma de comprobar el éxito de un paso de dicha instalación sería añadir una llamada de procedimiento a medida para cada [Ejecutar] entrada mediante el parámetro AfterInstall. En tal función se podría, por ejemplo, comprobar si un control OCX se ha instalado correctamente:

[Run] 
Filename: "{tmp}\MyInstallation1.exe"; Parameters: "/foo"; AfterInstall: AfterMyInstallation1 

[Code] 
var 
    MyInstallation1Success: boolean; 

procedure AfterMyInstallation1; 
var 
    V: Variant; 
begin 
    try 
    V := CreateOleObject('MyInstallation.InstalledOcxControl.1'); 
    MyInstallation1Success := True; 
    except 
    MyInstallation1Success := False; 
    end; 
end; 

o si los directorios y entradas del registro para la dependencia son todo lo que hay.

Cada [Ejecutar] entrada sólo se ejecuta cuando su parámetro opcional Comprobar no return true. De modo que, dependiendo de sus necesidades, puede iniciar todas las instalaciones silenciosas una después de la otra y, una vez que la última haya terminado, ejecutar una función de script para verificar que todas las dependencias se hayan instalado correctamente; o podría escribir una función de verificación para cada instalación de dependencia, que luego devolvería falsa y omitiría todas las demás instalaciones después del primer error.

Sin embargo, tenga en cuenta que todas las entradas [Ejecutar] se ejecutan después de completar los pasos para copiar archivos, escribir registros, etc., por lo que básicamente ya ha finalizado la instalación. Si realmente desea ejecutar todos sus pasos de instalación solo cuando todas las dependencias están instaladas correctamente, entonces tendría que hacer eso antes en el proceso, cuando la instalación aún puede cancelarse.

Editar: Salida la cuestión "How do you make Inno Setup not look frozen while performing a long Exec?" donde se da alguna información y un script de ejemplo está vinculada a sobre el uso del Exec() función para la instalación de dependencias. Por lo tanto, si no utiliza las entradas [Ejecutar], existe una buena posibilidad de lograr lo que desea.

+0

Gracias mghie, creo que eso es lo que estoy buscando. ¿Hay algún gancho para cancelar disponible en la sección de ejecución? –

+0

Lo siento, he editado mi respuesta para incorporar más información, parece que realmente no puedes hacer lo que quieres con las entradas [Ejecutar]. – mghie

1

Puede usar my answer a una pregunta similar para ejecutar comandos de forma segura en la sección [Ejecutar] con la notificación adecuada y la reversión en caso de error.

El enlace anterior es una solución completa, pero la idea es Folowing:

1) Escribir mensaje de error al archivo temporal {tmp} \ Install.error al usar el parámetro BeforeInstall de InnoSetup.

2) Use el comando de Windows shell "cmd.exe/s/c" para ejecutar el programa deseado. También use la ejecución condicional del comando "del" con "& &" - http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ntcmds_shelloverview.mspx?mfr=true. Por lo tanto, el archivo de mensaje de error se eliminará si el comando tiene éxito (código de salida 0). Tenga en cuenta el manejo de comillas especiales en "cmd.exe/s/c".

3) Compruebe la existencia del archivo de mensaje de error {tmp} \ install.error utilizando el parámetro AfterInstall de InnoSetup y cancele la instalación con la notificación o confirmación adecuada (y presentación opcional del archivo de registro) y realice la reversión utilizando Exec (ExpandConstant ('{uninstallexe } '), ...

4) Hay algunos pasos adicionales deben ser realizados como primordial de InnoSetup ShouldSkipPage (PageID: la función de ocultar página final entero), etc.

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. – Uriil

+0

Gracias por la nota. He incluido una descripción de idea común aquí. –

Cuestiones relacionadas