WIX:如何在安装条件下使用文件搜索结果?

时间:2016-10-25 19:19:16

标签: wix install installer burn

我正在使用WIX创建一个包。我使用util:FileSearch检查文件是否存在,如果该文件存在,我想安装MsiPackage。我还检查了有效的处理器架构。

这是Bundle.wxs:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
    <Bundle Name="My_Setup_2" Version="1.0.0.0" Manufacturer="ABC" UpgradeCode="3945a604-d6ae-4334-8a5b-1e9e2f222e08">
        <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
        <Chain>
            <PackageGroupRef Id="MyInstallx64"/>
        </Chain>
    </Bundle>
  <Fragment>
    <util:FileSearch Id="Outlook2013Search"
                     Variable="Outlook2013Exists"
                     Result="exists"
                     Path="[ProgramFilesFolder]Microsoft Office\Office15\OUTLOOK.EXE"/>

    <PackageGroup Id="MyInstallx64">
      <MsiPackage
        SourceFile="MyInstallx64.msi"
        InstallCondition="ProcessorArchitecture = 9 AND Outlook2013Exists = true" Visible="yes" >
      </MsiPackage>
    </PackageGroup>
  </Fragment>
</Wix>

我在InstallCondition中放置了什么,以便msi仅在此文件存在时才安装?我试过&#34; Outlook2013Exists = true&#34;但这不起作用。

2 个答案:

答案 0 :(得分:1)

您可能不应该根据文件搜索执行installCondition。可能会出现一些问题,

  1. 不是正确的版本。也许这个特定产品不是问题,但也可能适用于其他产品。也许版本13.4+支持您的产品,但它不适用于13.3或更早版本。
  2. 未安装在C:\ Program Files中!这是更可能的情况。该产品不必安装在程序文件中,甚至不必安装在C:\驱动器上。
  3. installCondition的最佳选择是检查注册表项。通常所有注册表项将位于相同的路径HKLM \ SOFTWARE \ Microsoft \ Office \ 15.0 \ Common \ ProductVersion中,并检查HKLM \ SOFTWARE \ Microsoft \ Office \ 15.0 \ Outlook是否存在

    以此为例,你可以做到

    <util:RegistrySearch
      Id="Office15Installed_x64"
      Win64="yes"
      Root="HKLM"
      Key="SOFTWARE\Microsoft\Office\15.0\Common"
      Value="ProductVersion"
      Result="value"
      Variable="Office15Installed_x64" />
    <util:RegistrySearch
      Id="Outlook15Bitness_x64"
      Win64="yes"
      Root="HKLM"
      Key="SOFTWARE\Microsoft\Office\15.0\Outlook"
      Value="Bitness"
      Result="value"
      Variable="Outlook15Bitness_x64" />
    

    您还可以在&#34; Common \ InstallRoot&#34;

    中找到安装路径

    然后你会使用像这样的安装条件

    InstallCondition="Office15Installed_x64 AND Outlook15Bitness_x64 ~= &quot;x64&quot;"
    

    我现在只在我的计算机上安装了32位,因此您必须查看安装了Outlook 64位的计算机的注册表才能查看要使用的正确值。

    <小时/>

    如果要将文件搜索结果用作安装条件,则只需使用

    InstallCondition="ProcessorArchitecture = 9 AND Outlook2013Exists"
    

    IIRC,文件搜索会创建一个属性,并根据是否找到该文件将其设置为1或0。在一个条件中,1被视为真理,0是假。

    此外,请在运行后查看引导程序日志。这非常有用,因为它可以显示属性值和安装条件的评估结果。

答案 1 :(得分:0)

使用WiX util组件ID搜索可能会更好,例如在这个问题中:

What Component IDs should I search for to detect whether the Office 2010 PIA's are Installed

其中也引用了其他Office版本。这篇文章也是这样的:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/bdcd8850-0b6a-4fd1-a0cb-647ff12c3088/finding-the-component-id-for-office-2013?forum=vsto

在不知道您的MSI产品的作用的情况下,您可能需要担心64位和32位版本的Office,因此文件位置可能是ProgramFiles或ProgramFiles(x86),具体取决于版本并假设它为&#39 ; s首先安装在那里。如果要安装加载项,则可能需要为Office的两个版本提供支持。