让WiX / MSI总是安装一些注册表,保留一些已有的注册表



我有一个WiX安装,也需要写一些注册表项,我想知道是否有一种方法告诉WiX/MSI

  • 只在还不存在的情况下创建密钥
  • 总是创建/覆盖另一个键,即使它存在

我试过这样做:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="*" Name="TestRegistry" Language="1033" Version="1.0.2"
             Manufacturer="Myself" UpgradeCode="PUT-GUID-HERE">
    <Package InstallerVersion="200" Compressed="yes" 
                     InstallScope="perUser" InstallPrivileges="limited" />
    <MajorUpgrade DowngradeErrorMessage="A newer version installed." />
                <MediaTemplate EmbedCab="yes" />
                <Feature Id="ProductFeature" Title="TestRegistry" Level="1">
      <ComponentRef Id="ProductComponents" />
    </Feature>
  </Product>
  <Fragment>
   <Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramFilesFolder">
     <Directory Id="dirManufacturer" Name="Manufacturer">
      <Directory Id="INSTALLFOLDER" Name="TheProduct">
       <Component Id="ProductComponents" Guid="*" DiskId="1">
        <RegistryKey Root="HKCU" Key="SoftwareManufacturerTheProduct"
                     Action="createAndRemoveOnUninstall">
          <RegistryValue Type="string" Name="Install Directory" 
                         Value="[INSTALLFOLDER]" KeyPath="yes" />
          <RegistryValue Type="string" Name="Product Version" 
                         Value="[ProductVersion]" />
          <RegistryValue Type="string" Name="Default Language" Value="en" />
          <RegistryValue Type="string" Name="Web Site URL" 
                         Value="https://product.manufacturer.info/" />
        </RegistryKey>
       </Component>
      </Directory>
     </Directory>
    </Directory>
   </Directory>
  </Fragment>
</Wix>

和这里,我想总是覆盖Install DirectoryProduct Version键与当前值,但我想保留其他设置,如Default Language

有什么办法可以做到吗?

现在,当我在新系统上安装1.0.0 fresh时,它会创建注册表项。当我卸载它的时候,它们都不见了——到目前为止,很好。

但是当我安装了v1.0.1,然后——没有卸载v1.0.1——在此基础上安装了v1.0.2时,所有定义的注册表项都更新了,并包含了WiX脚本中定义的默认值——我手工做的更改被清除了。

您需要将注册表值拆分为自己的组件,并在其上设置NeverOverwrite属性

<Component Id="DefaultLangaugeComponent" Guid="*" NeverOverwrite="yes">
  <RegistryKey Root="HKCU" Key="SoftwareManufacturerTheProduct"
                                     Action="createAndRemoveOnUninstall">
   <RegistryValue Type="string" Name="Default Language" Value="en" />
  </RegistryKey>
</Component>

最新更新