11

我在 Wix 3.7 上。我有一个 MSI,我想设置一个注册表键(可能通过自定义操作,因为他必须检查该键是否已经存在)。

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

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

捆:

<?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>
4

2 回答 2

12

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

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

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

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

在此之后,您可以在 Bootstrapper 中设置属性,如下所述:WiX Bootstrapper:如何从命令行设置刻录变量?

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

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

更新:

然后,在 MSI 中,您可以基于此属性进行注册表搜索:

<RegistrySearch Id="GetSomeValue" Root="HKLM" Key="SOFTWARE\<Manufacturer>\[SOMEPROPERTY]" Name="<ValueName>" Type="raw" />
于 2013-08-13T12:57:56.657 回答
1

只是为了添加一些额外的信息。要使用命令行更改变量值,我实际上必须将其设置为可覆盖。

<Variable Name="SomeProperty" Type="string" Value="true" bal:Overridable="yes" />
于 2019-02-21T19:17:14.663 回答