WIX, вызывающий пакетный файл в последовательности InstallExecution - PullRequest
5 голосов
/ 05 марта 2012

Я новичок в WIX и пытаюсь вызвать командный файл из моего установщика WIX. MyBatch.bat содержит простую копию текстового файла из c: \ в D: \

Я не могу вызвать командный файл. Ниже мой код.

Пожалуйста, помогите мне.

  <?xml version="1.0" encoding="UTF-8"?>
  <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <?define ProductName='Test Product' ?>
  <?define ProductVersion='1.0.0.0' ?>
  <?define ProductCode='b7bc7c6f-9a4e-4973-be84-eca8e3427c97'?>
  <?define UpgradeCode='06a81104-1e30-463d-87e1-e8a79b4c682a'?>
  <?define Manufacturer='Respond'?>
  <Product Id="$(var.ProductCode)" Language="1033" Version='$(var.ProductVersion)' Name='Respond'
  Manufacturer='$(var.Manufacturer)' UpgradeCode='$(var.UpgradeCode)'>
    <Package InstallerVersion='200' Compressed='yes' />
    <Media Cabinet='media1.cab' EmbedCab='yes' Id ='1' />
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id='ProgramFilesFolder'>
        <Directory Id='INSTALLDIR' Name='$(var.ProductName)'>
          <Component Id='ProductComponent' Guid='b11556a2-e066-4393-af5c-9c9210187eb2'>
            <File Id='Calc' DiskId='1' Source='C:\WINDOWS\system32\calc.exe'/>
            <File Id='my_batch_script' Name='MyBatch.bat' DiskId='1' Source='MyBatch.bat'   />
          </Component>
        </Directory>
      </Directory>
      <Directory Id='ProgramMenuFolder'>
        <Directory Id='ApplicationProgramsFolder' Name='$(var.ProductName)'>
          <Component Id='MainExecutable' Guid='EDED00D8-2465-46CA-86D6-B20DE921EFA6'>
            <Shortcut Id='ShortcutCalc' Description='$(var.ProductName)' Name ='Calculator of Windows'
            Target='[INSTALLLOCATION]Calc.exe' WorkingDirectory='INSTALLLOCATION'/>
            <RemoveFolder Id='ApplicationProgramsFolder' On='uninstall'/>
            <RegistryValue Root='HKCU' Key='Software\$(var.Manufacturer)\$(var.ProductName)' Type ='multiString'
            Name='installed' Value='1' KeyPath='yes'/>
          </Component>
        </Directory>
      </Directory>
    </Directory>

    <Feature Title='SetupProject1' Level='1' Id ='AppFeature'>
      <ComponentRef Id='ProductComponent' Primary='yes'/>
      <ComponentRef Id='MainExecutable'/>
    </Feature>

    <Property Id='WIXUI_INSTALLDIR' Value='INSTALLDIR' ></Property>
    <WixVariable Id='WixUILicenseRtf' Overridable='yes' Value='License.rtf'/>
    <?include CustomActions.wxi?>
    <UI>
      <?include UISequence.wxi?>
      <?include Dialogs.wxi?>
    </UI>

    <CustomAction Id="BatchCmd" Property="ThePath" Value="[INSTALLDIR]MyBatch.bat" />
    <CustomAction Id="BatchRun" Property="ThePath" ExeCommand='"[INSTALLDIR]MyBatch.bat"' Return='asyncWait' Impersonate="yes"/>

    <InstallExecuteSequence>
      <Custom Action="BatchCmd" After="InstallFiles" >Not Installed </Custom>
      <Custom Action="BatchRun" After="BatchCmd">Not Installed </Custom>
    </InstallExecuteSequence>
  </Product>

</Wix>

Ответы [ 4 ]

6 голосов
/ 06 марта 2012

Это сработало для меня.

<CustomAction Id="test"
    ExeCommand="[INSTALLDIR]MyBatch.bat"
    Directory="INSTALLDIR" Execute="deferred" Return="asyncWait"/>

<InstallExecuteSequence>
    <Custom Action="test" After="InstallFiles">NOT Installed</Custom>
</InstallExecuteSequence>
2 голосов
/ 05 марта 2012

Кажется, вы решили свою проблему с помощью неправильного инструмента. Если файл для копирования является частью вашего приложения, вы должны создать Компонент с этим Файл внутри. В противном случае, если вам нужно просто скопировать некоторый внешний файл, уже присутствующий в целевой системе, вы должны создать элемент CopyFile , вложив его в элемент Component.

1 голос
/ 28 августа 2017

Добавьте определение CustomAction, как указано ниже.Убедитесь, что Return = "ignore", если вы ничего не возвращаете из файла bat.

<CustomAction Id="RunBat" Directory="your_directory"
    ExeCommand='"c:\test\test.BAT"'
    Execute='deferred' Impersonate='no' Return='ignore'/>

Также в последовательности installExecuteSequence добавьте действие перед InstallFinalize

<InstallExecuteSequence>
    <Custom Action="RunBat" Before="InstallFinalize">
        NOT (REMOVE~="ALL")
    </Custom>
</InstallExecuteSequence>
1 голос
/ 06 марта 2012

Я согласен с Ян , вы решаете свою задачу неправильно.


Что касается пакетных файлов, они не выполняются сами по себе, как .exe, это cmd.exe, который читает файл bat и выполняет его построчно.

Чтобы запустить командный файл, вы должны запустить его следующим образом:

cmd.exe /c batch.bat
...