我有一个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 Directory
和Product 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>