如何使用Get-Item:Set-Item和ExportTo-CliXml通过PowerShell迁移registry项

我试图导出各种软件应用程序的select性registry项,首选项和configuration,然后将它们导入到新机器上。

Get-ChildItem Registry::HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\OneNote -Recurse | Export-Clixml -Depth 3 -Path OneNote.xml 

然后在不同的时间使用另一台机器上的这个过程

 Import-CliXml -Path OneNote.xml | Set-Item 

这似乎并没有工作,但这不是明显的原因。 从概念上讲,似乎像这样的东西应该工作。

理想的情况下,下一步将能够获得密钥,过滤它们并将它们全部存储在一个文件中,然后在另一台机器上干净地恢复它们。

这可以用registry编辑器完成,但我很好奇PowerShell是如何完成的。

如果它们不存在并创build它们的值,而不是创build它们的值,则Import-CliXml命令会在对应于该键的path的键中的默认属性名称下创build值。 例如:

在目标机器上,一个目标关键字如:

 HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\OneNote\OpenNoteBooks 

现在将包含具有以下值的默认项目:

 "HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\OneNote\OpenNoteBooks" 

而不是来自源密钥的预期属性。

对于上下文来说,在基本的层面上,我想做的事情可以通过以下方式来完成:

 reg export HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\OneNote OneNote.reg 

然后,创build一个包含键值的registry文件。

 reg import OneNote.reg 

在目标机器上加载它们。 显然这对于​​简单的“转储和恢复”操作来说很简单,但是如果希望先用某种逻辑来处理它们的键,那么它就不那么灵活了。

有几个原因可能导致无法按预期工作。

首先在Set-Item 文档注释部分说明:

在注册表驱动器中,HKLM:和HKCU:, Set-Item更改注册表项的(默认)值中的数据 。 要创建和更改注册表项的名称,请使用New-Item和Rename-Item。 要更改注册表值中的名称和数据,请使用New-ItemProperty,Set-ItemProperty和Rename-ItemProperty。

所以,马上我们注定要做到这一点,就像你直觉上想的那样。

其次,如果您查看Import-CliXml -Path OneNote.xml的输出,则没有提供的注册表值类型信息,例如DWORDQWORD等,因此使用此输入的任何工具都不会知道如何正确构建密钥值,因为没有类型暗示。

你最好坚持老的reg.exe工具。 它的行为已被证实和可预测。 如果你需要调整一些值的话,解析一个.reg文件也不难。