2015-07-28 1 views
1

Lors de l'installation, j'ajoute une clé de configuration à une base de données à l'aide d'un outil de ligne de commande. Lors de la désinstallation, j'essaie maintenant de supprimer cette clé de configuration. Lors d'une mise à niveau, je dois supprimer puis ajouter la clé de configuration.WiX Toolset - CustomAction pour la désinstallation exécutée après RemoveFiles

Voici mon CustomAction "expurgée" Code:

<CustomAction Id="Unset_AppName_Version_Cmd" 
       Property="Unset_AppName_Version" 
       Execute="immediate" 
       Value="&quot;[SystemFolder]cmd.exe&quot; /C &quot;&quot;[SOMEDIR]SomeClTool&quot; &quot;uninstall:appname&quot;&quot;" /> 

<CustomAction Id="Unset_AppName_Version" 
       BinaryKey="WixCA" 
       DllEntry="CAQuietExec" 
       Execute="immediate" 
       Return="check" 
       Impersonate="yes" /> 

Note: J'ai essayé plusieurs valeurs pour exécuter, y compris oncePerProcess, firstSequence et immédiat.

Voici mon InstallExecuteSequence code "expurgée":

<Custom Action="Unset_AppName_Version_Cmd" Sequence="1215"> 
    (!AppName = 3 AND (&amp;AppName = 3 OR &amp;AppName = 2))  
</Custom> 
<Custom Action="Unset_AppName_Version" Sequence="1216"> 
    (!AppName = 3 AND (&amp;AppName = 3 OR &amp;AppName = 2)) 
</Custom> 

Note: Encore une fois, j'ai essayé de déplacer la séquence utilisée. Dans l'exemple ci-dessus avant InstallValidate, mais aussi avant RemoveFiles, RemoveODBC, etc

Rien n'a fonctionné pour moi. Dans tous les cas, la

Executing op: ActionStart(Name=Unset_AppName_Version,,) 

ligne est en cours d'exécution après RemoveFiles, donc mon action personnalisée échoue avec:

CAQuietExec: The system cannot find the path specified. 
CAQuietExec: Error 0x80070001: Command line returned an error. 
CAQuietExec: Error 0x80070001: CAQuietExec Failed 

Après cela, mon installation est annulée pour.

De plus, cette condition est-elle correcte pour être exécutée lors de la désinstallation ou de la réinstallation?

(!AppName = 3 AND (&amp;AppName = 3 OR &amp;AppName = 2)) 

Merci

Mise à jour 7/31/2015

Bien que je ne comprends toujours pas une solution de travail, je l'ai fait assez de changements qu'il est logique de poster mon code actuel.

Voici mon CustomAction mis à jour le code « expurgée »:

<CustomAction Id="Unset_AppName_Version_Cmd" 
       Property="QtExecCmdLine" 
       Value="&quot;[SystemFolder]cmd.exe&quot; /C &quot;&quot;[SOMEDIR]SomeClTool&quot; &quot;uninstall:appname&quot;&quot;" 
       Execute="immediate" /> 

<CustomAction Id="Unset_AppName_Version" 
       BinaryKey="WixCA" 
       DllEntry="CAQuietExec" 
       Execute="immediate" 
       Return="ignore" /> 

Note: Ces modifications ont été apportées en fonction des suggestions beaucoup appréciées de Kiran et d'imiter certaines commandes Taskkill qui travaillent pour moi.

Exemple de code de travail:

<CustomAction Id="TaskKill_erl_exe_Cmd" 
       Property="QtExecCmdLine" 
       Value='"[SystemFolder]taskkill.exe" /F /IM erl.exe /T'     
       Execute="immediate" /> 

<CustomAction Id="TaskKill_erl_exe" 
       BinaryKey="WixCA" 
       DllEntry="CAQuietExec" 
       Execute="immediate" 
       Return="ignore"/> 

Merci

Répondre

1

Couple de choses ici.

-Vous essayez d'exécuter l'action personnalisée en mode immédiat à l'aide de l'action personnalisée Intégration silencieuse intégrée fournie par Wix.

http://wixtoolset.org/documentation/manual/v3/customactions/qtexec.html

Si vous voulez utiliser CAQuietExec en le mode immédiat, la documentation indique clairement que vous devez définir la propriété WixQuietExecCmdLine.

Je ne vois pas cela étant fait dans votre cas.

Dans votre cas, je vois que vous définissez une propriété nommée Unset_AppName_Version dans le mode immédiat. Cela ne marchera pas.

-Si vous essayez d'utiliser CAQuietExec en différé en mode, votre création des actions personnalisées dans l'extrait de code collé fonctionnera, car cela conduirait à peuplant la valeur de la propriété spéciale intégrée « CustomActionData » -Si l'outil de ligne de commande que vous essayez de lancer est installé par le package msi, l'action personnalisée avec Id = "Unset_AppName_Version" doit être séquencée après l'action standard "InstallFiles" dans le cas d'installation/mise à niveau/Ré-installer. Pour le cas de désinstallation, je suppose que vous aurez une action personnalisée séparée qui appelle cet outil en ligne de commande avec un ensemble différent de paramètres et il doit être séquencé avant l'action standard "RemoveFiles". -Enfin, oui, votre condition est correcte et invoquera l'action lors de la réinstallation ou de la désinstallation de la fonction. -Egalement lorsque vous exécutez votre paquet msi, si vous voulez confirmer si l'outil de ligne de commande a effectivement été lancé, vous pouvez lancer un utilitaire nommé "ProcessMonitor". ProcessMonitor provient de la suite Sysinternals. Laissez l'outil fonctionner en définissant les filtres appropriés. Si votre outil est déjà lancé, ProcessMonitor vous indiquera la même chose.

Espérons que cela aide.

+0

Merci. J'avais déjà passé à Property = "QtExecCmdLine", ce qui semble fonctionner. WixQuietExecCmdLine est-il un meilleur choix? J'ai essayé le séquençage avant RemoveFiles (je cherche seulement à exécuter ceci sur la désinstallation ou sur la partie de désinstallation d'un MajorUpgrade). J'ai même placé les actions personnalisées dans la gamme de séquences 1200+ sans condition. Il s'exécute dans la séquence sélectionnée, mais réessaie après RemoveFiles, ce qui provoque un échec et un retour en arrière. J'ai essayé une foisPerProcess et firstSequence pour essayer de ne l'exécuter qu'une seule fois, mais rien ne semble empêcher WiX d'exécuter après RemoveFiles. – sleon

+0

Inspectez votre msi construit en utilisant Orca. Orca fait partie du programme d'installation de Windows SDK. Inspectez la table InstallExecuteSequence et vérifiez les numéros de séquence affectés à votre action personnalisée, ainsi que RemoveFiles. Si c'est l'exécution après RemoveFiles, alors il est séquencé plus tard. Les numéros de séquence sont vraiment relatifs et ils peuvent changer en fonction du nombre d'actions personnalisées présentes. Le bon moyen est d'inspecter le paquetage msi en utilisant Orca. En outre, avez-vous inspecté à l'aide de Process Monitor pour voir si la commande correcte a été invoquée? –

+0

Merci encore Kiran. J'ai vérifié Orca et les choses allaient bien, les séquences 1211 ... 1214. Dans le journal détaillé, je vois "Action terminée 12:25:58: MigrateFeatureStates". Ensuite, je vois mes tests de conditions comme faux, donc les CustomActions sont sautés.Le côté de la commande (Unset_AppName_Version_Cmd) s'exécute après "WriteEnvironmentStrings", ce qui semble correct (avant RemoveFiles). Le problème est que Unset_AppName_Version n'est pas exécuté avant la phase InstallFinalize. Je ne comprends pas le délai. Que recommandez-vous en tant que paramètres pour Execute et Impersonate (je me suis débarrassé de cela) pour Unset_AppName_Version? – sleon

0

Cela a fini par travailler pour moi:

<CustomAction Id="Unset_AppName_Version_Cmd" 
       Property="QtExecCmdLine" 
       Value="&quot;[SystemFolder]cmd.exe&quot; /C &quot;&quot;[SOMEDIR]SomeClTool&quot; &quot;uninstall:appname&quot;&quot;" 
       Execute="immediate" /> 

<CustomAction Id="Unset_AppName_Version" 
       BinaryKey="WixCA" 
       DllEntry="CAQuietExec" 
       Execute="immediate" 
       Return="ignore" /> 

Et dans le InstallExecuteSequence:

<Custom Action="Unset_AppName_Version_Cmd" Sequence="1215"> 
    (!AppName = 3 AND (&amp;AppName = 3 OR &amp;AppName = 2))  
</Custom> 
<Custom Action="Unset_AppName_Version" Sequence="1216"> 
    (!AppName = 3 AND (&amp;AppName = 3 OR &amp;AppName = 2)) 
</Custom> 

La question semble être que quelque chose se foiré dans ma machine virtuelle avec tous les rollbacks.

Le problème principal que j'avais était que j'ai d'abord essayé de nommer la propriété dans le "Unset_AppName_Version_Cmd" CustomAction.

Merci encore à Kiran pour toute son aide.

+0

Je suis content que vous l'ayez fait fonctionner. Quel était le changement exact par rapport à votre version précédente? –

+0

Ce n'était pas tellement un changement car il semblait y avoir un problème avec un VM que j'utilisais. Un CustomAction que j'avais supprimé s'affichait toujours dans les journaux, je suis donc revenu à un instantané antérieur. – sleon