2009-02-24 9 views
8

Je voudrais appeler plusieurs fichiers .msi en mode silencieux et arrêter l'installation complète en cas d'échec.Codes de retour msi dans Inno Setup

Est-il possible d'obtenir les codes retour de msiexec.exe à partir de la section [run]?

Actuellement, je ne peux voir que les messages d'erreur dans l'observateur d'événements Windows.

Répondre

5

Il n'existe actuellement aucun moyen de vérifier l'exécution réussie des entrées [Exécuter]. Le code enregistre simplement le code de sortie du processus et continue avec l'entrée suivante (il peut être examiné dans le fichier source Inno Setup Main.pas, la fonction est ProcessRunEntry(), en commençant à la ligne 3404 dans la version actuelle 5.2. 3).

Si vous avez besoin de vous assurer que plusieurs exécutions de msiexec ont réussi, vous devrez coder une couche intermédiaire. Cela peut être aussi simple qu'un petit bout qui est exécuté dans les entrées [Exécuter] et démarre msiexec.exe avec les paramètres corrects, attend la fin du processus, puis écrit le code retour dans un fichier.

Une autre façon de vérifier la réussite d'une telle étape d'installation serait d'ajouter un appel de procédure personnalisée pour chaque entrée [Exécuter] en utilisant le AfterInstall paramètre. Dans une telle fonction, vous pouvez par exemple vérifier si un contrôle OCX a été installé avec succès:

[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; 

ou si les répertoires et les entrées de registre pour la dépendance sont tous là.

Chaque [Exécuter] est entrée exécutée uniquement lorsque son option paramètre Check ne retourne vrai. Ainsi, en fonction de vos besoins, vous pouvez démarrer toutes les installations silencieuses les unes après les autres et, après la fin, exécuter une fonction de script pour vérifier que toutes les dépendances ont été correctement installées; ou vous pourriez écrire une fonction de vérification pour chaque installation de dépendance, qui retournerait alors false et ainsi passerait toutes les autres installations après la première échec. Notez cependant que toutes les entrées [Exécuter] sont exécutées une fois que les étapes de copie de fichier, d'écriture de registre, etc. sont terminées, de sorte que vous avez pratiquement terminé l'installation. Si vous voulez réellement exécuter toutes vos étapes d'installation seulement quand toutes les dépendances sont correctement installées, alors vous devriez le faire plus tôt dans le processus, quand l'installation peut encore être annulée.

Edit: Consultez la question "How do you make Inno Setup not look frozen while performing a long Exec?" où certaines informations sont données et un exemple de script est lié à sur l'utilisation du Exec () fonction pour l'installation de dépendances. Donc, si vous n'utilisez pas [Exécuter] entrées il y a une bonne chance de réaliser ce que vous voulez.

+0

Merci mghie, je pense que c'est ce que je suis à la recherche. Y a-t-il des hooks à annuler disponibles dans la section run? –

+0

Désolé, j'ai édité ma réponse pour incorporer plus d'informations - il semble que vous ne puissiez pas vraiment faire ce que vous voulez en utilisant les entrées [Exécuter]. – mghie

1

Vous pouvez utiliser my answer à une question similaire pour exécuter des commandes en toute sécurité dans la section [Exécuter] avec la notification appropriée et l'annulation en cas d'erreur.

Le lien ci-dessus fournit une solution complète, mais idée est que vous avez choisi:

1) Ecrire un message d'erreur dans un fichier temporaire {tmp} \ install.erreur en utilisant le paramètre BeforeInstall d'InnoSetup.

2) Utilisez le shell de commande Windows "cmd.exe/s/c" pour exécuter le programme souhaité. Utilisez également l'exécution conditionnelle de la commande "del" avec "& &" - http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/ntcmds_shelloverview.mspx?mfr=true. Donc le fichier de message d'erreur serait supprimé si la commande réussissait (code de sortie 0). Veuillez tenir compte des citations spéciales traitant dans "cmd.exe/s/c". 3) Vérifier l'existence du fichier de message d'erreur {tmp} \ install.error en utilisant le paramètre AfterInstall d'InnoSetup et abandonner l'installation avec la notification ou la confirmation appropriée (et la présentation optionnelle du fichier journal) et effectuer une restauration en utilisant Exec (ExpandConstant ('{uninstallexe } '), ...

4) Il y a quelques étapes supplémentaires doivent être effectuées comme remplaçant ShouldSkipPage (la PageID de InnoSetup: Entier) pour masquer la dernière page, etc.

+0

Alors que ce lien peut répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. – Uriil

+0

Merci pour la note. J'ai inclus une description d'idée commune ici. –

Questions connexes