我们使用InstallShield技术为客户准备了安装程序。安装程序工作正常但客户端希望使用msi技术中的此安装程序。我们决定使用WiX创建包装器。 Msi安装程序应该做几件事:
我们之前没有使用WiX技术安装,这些是我们的问题:
这是我迄今为止创建的* .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>
答案 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
将参数传递给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"/qn INSTALLDIR=\"[InstallPath] \" HOST_ADDRESS=[HostAddress] HOST_PORT=[HostPort] SCANNER_MODEL=[ScannerType]""
Condition="use_registry_values=1 AND other_cond=1"/>
</ExePackage>
</Bundle>
</Wix>
http://helpnet.installshield.com/installshield22helplib/helplibrary/IHelpSetup_EXECmdLine.htm