WiX安装时如何迁移整个注册表键的所有值
WiX安装程序批量迁移动态注册表值实现方案
这个需求完全可以实现,不需要提前枚举旧注册表键下的动态值、逐个硬编码迁移逻辑,常用的落地实现方式有两种:
- 通用兼容方案:编写自定义动作完成注册表枚举复制
该方案适配WiX v3、v4全版本,稳定性最高:- 把自定义动作的执行时机配置在
InstallInitialize节点之后、WriteRegistryValues动作之前,保证迁移逻辑在安装程序写入新注册表配置前跑完 - 自定义动作里直接调用Windows原生注册表API:先打开旧键路径
HKLM\Software\MyCompany\MyProduct\SomeOldSetting,枚举这个键下的所有值项,逐个读取每个值的类型、存储内容,完整写入到目标路径HKLM\Software\MyCompany\MyProduct\SomeNewSetting下就行 - 如果安装包有32位版本、需要兼容64位系统,打开注册表的时候要显式传入
KEY_WOW64_64KEY标志,避免被系统重定向到Wow6432Node路径,导致读不到旧配置 - 迁移完成后按业务需求决定要不要保留旧注册表键,不需要保留的话直接递归删掉旧键就可以
- 把自定义动作的执行时机配置在
- 轻量方案:内嵌PowerShell脚本实现迁移(不用单独编译自定义动作DLL)
不想额外开发自定义动作DLL的话,可以直接在WiX项目里嵌一个即时执行的PowerShell脚本完成操作,核心逻辑参考:
用这个方案要提前配置好安装包的脚本执行权限,避免被系统的脚本拦截策略阻断运行。$oldRegPath = "HKLM:\Software\MyCompany\MyProduct\SomeOldSetting" $newRegPath = "HKLM:\Software\MyCompany\MyProduct\SomeNewSetting" if (Test-Path $oldRegPath) { if (-not (Test-Path $newRegPath)) { New-Item -Path $newRegPath -Force | Out-Null } Get-ItemProperty -Path $oldRegPath | Select-Object -ExcludeProperty PS* | ForEach-Object { $_.PSObject.Properties | ForEach-Object { Set-ItemProperty -Path $newRegPath -Name $_.Name -Value $_.Value -Force } } }
注意:别尝试通过WiX原生Registry表硬编码值项的方式做迁移,这个方法只能处理提前知道名称的值,覆盖不了动态生成的未知值项。
内容的提问来源于stack exchange,提问作者Stack Overflow is garbage
相关产品推荐
相关产品推荐

