从WiX捆绑包将命令行参数传递给MSI

时间:2013-07-18 17:09:37

标签: wix windows-installer wix3.7

我在Wix 3.7上。我有一个MSI,我想设置一个注册表项(可能通过自定义操作,因为他将不得不检查密钥是否已经存在)。

据我所知,bootstrapper项目中的Bundle无法更改机器状态(例如设置注册表)。因此,我试图通过<MsiProperty>传递命令行参数,但似乎不会在我的日志文件中显示为引导程序的命令行参数。

  1. 是否可以在Bundle中设置注册表项?
  2. 如果没有,我如何添加命令行参数(或其他一些自定义数据) 传递给MSI。
  3. MSI如何读取它传递给它的任何东西(无论它最终是命令行arg还是其他东西 其他人)。
  4. 软件包:

    <?xml version="1.0" encoding="UTF-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
      <Bundle 
              Name="MyInstallerBootstrapperLocalDb" 
              Version="1.0.0.0" 
              Manufacturer="some company" 
              UpgradeCode="PUT-GUID-HERE">
        <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />
        <Chain>
          <MsiPackage Id="MyInstallerInstaller" 
                      SourceFile="$(var.MyInstallerInstaller.TargetPath)" 
                      Compressed="no">
            <!-- TODO - if this is being set correctly, the MSI needs to 
                        interpret it and set up the key-->
            <MsiProperty Name="SetLocalDb" Value="yes"/>
          </MsiPackage>
        </Chain>
      </Bundle>
    </Wix>
    

2 个答案:

答案 0 :(得分:10)

您的MSI需要定义如下属性:

<Property Id="SOMEPROPERTY" Value="Default"/>

然后,您可以从捆绑包中设置此属性:

<MsiPackage SourceFile="<package>.msi" Id="SomeId">
    <MsiProperty Name="SOMEPROPERTY" Value="[SomeProperty]" />
</MsiPackage>

在此之后,您可以按照此处所述在Bootstrapper中设置属性:WiX Bootstrapper: How do I set burn variables from the command line?

请注意,SomeProperty是一个必须定义的Burn变量:

<Variable Name="SomeProperty" Type="string" Value="DefaultValue" />

更新

在MSI中,您可以根据此属性进行注册表搜索:

<RegistrySearch Id="GetSomeValue" Root="HKLM" Key="SOFTWARE\<Manufacturer>\[SOMEPROPERTY]" Name="<ValueName>" Type="raw" />

答案 1 :(得分:0)

只需添加一些额外的信息即可。要在命令行中更改变量值,实际上我必须将其设置为可重写。

 Dictionary<int, Owner> grouped = 
    myList.Items
        .GroupBy(elem => elem.Id)
        .ToDictionary(com => com.Key, com => new Owner() 
          { 
            Id = elem.Id, 
            Firstname = elem.Firstname 
          });