使用WiX为InstallShield安装程序创建msi包装器

时间:2013-07-31 11:52:42

标签: wix installshield wix3.7

我们使用InstallShield技术为客户准备了安装程序。安装程序工作正常但客户端希望使用msi技术中的此安装程序。我们决定使用WiX创建包装器。 Msi安装程序应该做几件事:

  1. 将IS安装程序解压缩到临时目录。
  2. 运行InstallShield setup.exe。
  3. IS完成后删除临时目录。
  4. 我们之前没有使用WiX技术安装,这些是我们的问题:

    1. 我们不知道如何使用WiX将目录及其所有文件(安装程序)嵌入到msi中。
    2. 我们不知道如何只运行msi(它不应该安装数据,只能在安装过​​程中运行嵌入式IS setup.exe并在之后删除)。
    3. 我们不知道如何在安装过程中运行exe。
    4. 这是我迄今为止创建的* .wxs文件:

      <?xml version="1.0" encoding="UTF-8"?>
      <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
          <Product Id="*" Name="ISSetupPackeger" Language="1033" Version="1.0.0.0" Manufacturer="MyCompany" UpgradeCode="8804d459-2ea5-4bbc-85f7-dfc8419cafe4">
              <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" Id="*" InstallPrivileges="elevated" />
      
              <!-- TODO setup.exe starts but we don't want to run it using cmd -->
              <CustomAction Id="LaunchInstaller" Directory="InstallerDir" ExeCommand="cmd /C setup.exe" Impersonate="yes" Return="ignore" />
              <InstallExecuteSequence>
                  <Custom Action="LaunchInstaller" After="InstallFinalize" />
              </InstallExecuteSequence>
      
              <Media Id='1' Cabinet='data.cab' EmbedCab='yes'/>
                  <Feature Id="ProductFeature" Title="WixInstallerProject" Level="1">
                      <ComponentGroupRef Id="ProductComponents" />
                  </Feature>
      
              <!-- TODO How to extract files to temp dir? Is there some TEMP constant? -->
              <Directory Id="TARGETDIR" Name="SourceDir" >
                  <Directory Id="TempDir" Name="inst">
                      <Directory Id="InstallerDir" Name="Installer"/>
                  </Directory>
              </Directory>
      
              <!-- component group which will be installed into tempdir -->
              <ComponentGroup Id="ProductComponents" Directory="InstallerDir">
                  <Component Id="Installer" Guid="7b8bd37f-7eda-4c3a-8155-9dae1a6bbf98">
                      <!-- TODO How to embed directory with all its files/subdirectories? -->
                      <File Id="_Setup.dll" Name="_Setup.dll" DiskId="1" Source="installer\_Setup.dll"/>
                      <File Id="data1.cab" Name="data1.cab" DiskId="1" Source="installer\data1.cab"/>
                      <File Id="data1.hdr" Name="data1.hdr" DiskId="1" Source="installer\data1.hdr"/>
                      <File Id="data2.cab" Name="data2.cab" DiskId="1" Source="installer\data2.cab"/>
                      <File Id="data2.hdr" Name="data2.hdr" DiskId="1" Source="installer\data2.hdr"/>
                      <File Id="ISSetup.dll" Name="ISSetup.dll" DiskId="1" Source="installer\ISSetup.dll"/>
                      <File Id="layout.bin" Name="layout.bin" DiskId="1" Source="installer\layout.bin"/>
                      <File Id="setup.exe" Name="setup.exe" DiskId="1" Source="installer\setup.exe"/>
                      <File Id="setup.ini" Name="setup.ini" DiskId="1" Source="installer\setup.ini"/>
                  </Component>
              </ComponentGroup>
      
          </Product>
      
      </Wix>
      

2 个答案:

答案 0 :(得分:1)

一些替代方案:

从文件中,您使用InstallShield创建的安装程序看起来像是一个InstallScript非MSI安装程序。您可能能够使用InstallShield转换器将其转换为InstallScript MSI安装程序。请参阅此问题和answer

我以不同的方式阅读转换为MSI的要求。对于任何类型的包装或转换是值得的,它应该利用Windows Installer来管理实际安装的文件的安装。为此,如果转换不可行,则必须从头开始重写安装程序。您的方法只是使用MSI作为捆绑。你应该澄清你想做什么。

如果您使用捆绑路线,WiX现在提供名为Burn的bootstrapper / downloader / chainer / bundler。有了它,您可以创建一个提取和运行现有安装程序的.exe。而且,如果需要,您可以创建InstallShield响应文件,以便可以静默运行现有安装。 (请参阅InstallShield文档。)

答案 1 :(得分:0)

您可以使用WiX Bootstrapper嵌入现有的InstallShield可执行文件。无需转换。

在我们的例子中,从InstallShield构建的Setup.exe实际上有一个MSI。 (我认为通常就是这种情况)。那么你有两个选择:
- 你可以提取MSI(google&#34;从InstallShield&#34中提取MSI;)并使用MsiPackage将其嵌入bootstapper中 - 或者您可以使用ExePackage

嵌入整个Setup.exe

将参数传递给MSI:easy

<MsiPackage Id="bla" SourceFile="path-to-msi>
  <MsiProperty Name="PUBLIC_PROPERTY_IN_UPPERCASE" value="yourvalue"/>
</MsiPackage>

将参数传递给InstallShield Setup.exe:棘手的
在我们的情况下,Setup.exe最终将参数传递给MSI,使用/ v&#34;-parameters-go-here-but-you-to-escape-proper-#34;
听起来很简单,但是正确地转义斜杠(\),单引号(&#39;),双引号(&#34;)很复杂。此外,如果整个InstallArgument包含在&#39;中,则WiX会以不同的方式转义\。 (单引号)或&#34; (双引号)。我从单引号开始,因为它看起来更容易,但最终使用双引号。使用安装日志查看实际通过每个层传递的内容。

<Wix> 
  <Bundle>

  <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.HyperlinkLicense">
      <bal:WixStandardBootstrapperApplication
        xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
        LicenseUrl=""/>
  </BootstrapperApplicationRef>

  <!-- rumor has it Windows Installer needs the trailing slash for paths -->
  <Variable Name="InstallPath" Value="C:\path\to\destination\on\target\machine\" Type="string" bal:Overridable="yes"/>


  <Chain>  
    <MsiPackage Id="package_your_msi"
                SourceFile="path-to-msi"
                DisplayInternalUI="no"
                ForcePerMachine="yes"
                Compressed="yes"
                After="package_some_other_msi">
      <MsiProperty Name="TEST_PROPERTY_5" Value="5"/>
    </MsiPackage>      


    <ExePackage Id="package_installshield_setup_exe"
                SourceFile="C:\path\to\Setup.exe"
                Compressed="yes" 
                PerMachine="yes">
        <CommandLine InstallArgument="/s /v&quot;/qn INSTALLDIR=\&quot;[InstallPath] \&quot; HOST_ADDRESS=[HostAddress] HOST_PORT=[HostPort] SCANNER_MODEL=[ScannerType]&quot;"
                     Condition="use_registry_values=1 AND other_cond=1"/>
        </ExePackage>
  </Bundle>
</Wix>

来源:
https://social.msdn.microsoft.com/Forums/windows/en-US/1a113abd-dca1-482b-ac91-ddb0dcc5465c/is-it-possible-to-pass-commandline-arguments-to-an-installshield-executable?forum=winformssetup

http://helpnet.installshield.com/installshield22helplib/helplibrary/IHelpSetup_EXECmdLine.htm