2016-09-10 3 views
0

Ich mache Installer mit WiX 3.10. Meine ursprüngliche Aufgabe besteht darin, Postgres-Dateien auf das Zielsystem zu kopieren, den Cluster zu initialisieren, den Dienst zu registrieren, ihn zu starten und die Datenbank bei der Installation wiederherzustellen und umgekehrt den Dienst zu stoppen, ihn aus dem System zu entfernen und Clusterdaten zu löschen. Ich habe zwei bat-Dateien geschrieben und benutzerdefinierte Aktionen hinzugefügt, um sie auszuführen und einige Bedingungen, wie an verschiedenen Stellen beschrieben, aber keine von ihnen funktioniert. Ich habe es mit und ohne CDATA, Installiert, INSTALLIERT und einigen anderen Varianten versucht, aber es führt immer beide Aktionen aus.Ausführen von benutzerdefinierten Aktionen nur bei der Installation oder Deinstallation

Hier ist die Wix-Datei, mit der ich jetzt experimentiere.

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Product Id="*" Name="Hatred_6" Language="1033" Version="1.0.0.0" Manufacturer="Satan" UpgradeCode="d9602b10-8428-4031-8c82-99288b21377f"> 
     <Package InstallerVersion="405" Compressed="yes" InstallScope="perMachine" InstallPrivileges="elevated"/> 

     <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." /> 
     <MediaTemplate EmbedCab="yes" /> 

     <CustomAction Id="AAction" Directory="INSTALLFOLDER" Execute="deferred" Impersonate="no" Return="check" 
         ExeCommand="cmd.exe /c &quot;a.bat&quot;">NOT Installed</CustomAction> 

     <CustomAction Id="BAction" Directory="INSTALLFOLDER" Execute="deferred" Impersonate="no" Return="check" 
         ExeCommand="cmd.exe /c &quot;b.bat&quot;">Installed</CustomAction> 

     <InstallExecuteSequence> 
      <Custom Action="BAction" After="InstallFiles" /> 
      <Custom Action="AAction" After="InstallFiles" /> 
     </InstallExecuteSequence> 

     <Feature Id="ProductFeature" Title="Hatred_6" Level="1"> 
      <ComponentGroupRef Id="ProductComponents" /> 
     </Feature> 
    </Product> 

    <Fragment> 
     <Directory Id="TARGETDIR" Name="SourceDir"> 
      <Directory Id="ProgramFilesFolder"> 
       <Directory Id="INSTALLFOLDER" Name="Hatred_6" /> 
      </Directory> 
     </Directory> 
    </Fragment> 

    <Fragment> 
     <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> 
      <Component Id="CalcComponent" Guid="515C0606-FD73-4B5D-ACF4-481123092A3E"> 
       <File Id="CalcFile" KeyPath="yes" Source="calc.exe" /> 
      </Component> 
      <Component Id="AComponent" Guid="515e3aa0-e5a0-4cd1-aaa5-ebf25a679a24"> 
       <File Id="AFile" KeyPath="yes" Source="a.bat" /> 
      </Component> 
      <Component Id="BComponent" Guid="85f7627e-fc39-4f78-a870-221d2d08375d"> 
       <File Id="BFile" KeyPath="yes" Source="b.bat" /> 
      </Component> 
     </ComponentGroup> 
    </Fragment> 
</Wix> 

bat-Dateien enthalten dir> a.txt und dir> b.txt so kann ich sehen, ob sie tatsächlich ausgeführt. Es ist etwas frustrierend, habe ich etwas falsch verstanden?

+0

Ich würde vorschlagen, ein ausführliches Protokoll, anstatt 'dir> a.txt', um festzustellen, ob eine benutzerdefinierte Aktion ausführt. –

+0

Ich brauche beide bat-Dateien, um trotzdem Nebenwirkungen zu erzeugen, und ich habe in verbose log nichts gefunden, das erklären kann, wie die Bedingungen der Aktion bewertet wurden. – Encarmine

Antwort

6

Bedingung sollte innerhalb Custom Element, nicht CustomAction platziert werden. Außerdem haben Sie während der Deinstallation keine InstallFiles Aktion. Verwenden Sie stattdessen RemoveFiles.

<CustomAction Id="AAction" Directory="INSTALLFOLDER" Execute="deferred" 
       Impersonate="no" Return="check" ExeCommand="cmd.exe /c &quot;a.bat&quot;" /> 
<CustomAction Id="BAction" Directory="INSTALLFOLDER" Execute="deferred" 
       Impersonate="no" Return="check" ExeCommand="cmd.exe /c &quot;b.bat&quot;" /> 

<InstallExecuteSequence> 
    <Custom Action="AAction" After="InstallFiles">NOT Installed</Custom> 
    <Custom Action="BAction" Before="RemoveFiles">Installed</Custom> 
</InstallExecuteSequence> 
+0

Diese Bedingungen werden während Upgrades weiterhin ausgeführt. "Installiert" bezieht sich auf das Produkt {Product GUID}, das installiert wird. Bei größeren Upgrades ist die Produkt-GUID anders, aber die Upgrade-GUIDs stimmen überein, sodass wir wissen, für welches Produkt es sich handelt. Ich würde die beiden Bedingungen auf "NOT WIX_UPGRADE_DETECTED AND NOT INSTALLED" und "NOT UPGRADINGPRODUCTCODE AND REMOVE ~ = ALL" ändern, damit diese Aktionen nur bei der Erstinstallation und der vollständigen Deinstallation von ** ausgeführt werden. –

+0

@BrianSutherland, Sie haben recht, aber die Erfahrung zeigt, dass die Dienste bei größeren Upgrades gestoppt werden sollten, so dass die ursprünglichen Bedingungen für die Autoren besser sind. –

+0

@SutarminAnton Der Fehler, den ich gemacht habe, ist irgendwie peinlich, Ihr Vorschlag hat geholfen. Was die genauen Bedingungen angeht, die ich brauche - es gibt einige gute Cheatsheets zu anderen SO-Antworten wie dieser: http://stackoverflow.com/questions/320921/how-to-add-a-wix-custom-action-that-hat nur- on-uninstall-via-msi – Encarmine

Verwandte Themen