2016-09-10 2 views
0

Я делаю установщик с WiX 3.10. Моя первоначальная задача - скопировать файлы Postgres в целевую систему, инициализировать кластер, зарегистрировать службу, запустить ее и восстановить базу данных при установке, а также в режиме обратного остановки, удалить ее из системы и очистить данные кластера. Я написал два файла bat и добавил пользовательские действия для их выполнения и некоторые условия, описанные в разных местах, но никто из них не работает. Я пробовал с и без CDATA, Installed, INSTALLED и некоторые другие варианты, но он всегда выполняет оба действия.Выполнение пользовательских действий только при установке или удалении

Вот файл wix, с которым я сейчас экспериментирую.

<?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> 

летучих файлы содержат каталог> a.txt и реж> b.txt, так что я могу видеть, если они на самом деле выполнены. Это несколько расстраивает, я что-то не понимаю?

+0

Я бы предложил использовать подробный журнал, а не 'dir> a.txt', чтобы определить, выполняется ли пользовательское действие. –

+0

Мне нужны оба файла bat для создания побочных эффектов, и я ничего не нашел в подробном журнале, который может объяснить, как оцениваются условия действия. – Encarmine

ответ

6

Состояние должно быть размещено внутри элемента Custom, а не CustomAction. Кроме того, во время удаления у вас нет InstallFiles. Используйте вместо этого 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

Эти условия будут выполняться во время обновлений. «Установленный» относится к установленному продукту {Product GUID}. При крупных обновлениях GUID продукта отличается от GUID Upgrade GUID, поэтому мы знаем, какой продукт это обновление. Я бы исправил два условия: «НЕ WIX_UPGRADE_DETECTED AND NOT Installed» и «NOT UPGRADINGPRODUCTCODE AND REMOVE» = «ALL», чтобы эти действия запускались ** только ** при первой установке и завершении удалений. –

+0

@BrianSutherland, вы правы, но опыт показывает, что услуги должны быть остановлены во время крупных обновлений, поэтому для авторов цели исходных условий лучше. –

+0

@SutarminAnton Ошибка, которую я сделал, смущает, ваше предложение помогло. Что касается точных условий, в которых я нуждаюсь - есть некоторые хорошие cheatsheets на других SO-ответах, подобных этому http://stackoverflow.com/questions/320921/how-to-add-a-wix-custom-action-that-happens-only- на деинсталлировать-через-MSI – Encarmine

Смежные вопросы