如何使用带有 Get-Item 的 PowerShell 迁移注册表项:Set-Item 和 ExportTo-CliXml

How to migrate registry entries with PowerShell with Get-Item : Set-Item and ExportTo-CliXml

我正在尝试导出各种软件应用程序的选择性注册表项、首选项和配置,然后将它们导入到新机器上。

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

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

反转这个过程
Import-CliXml -Path OneNote.xml | Set-Item

这似乎不起作用,但原因不明。从概念上讲,感觉好像这样的东西应该可行。

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

这可以使用 regedit 完成,但我很好奇如何使用 PowerShell 完成。

如果键不存在则不创建键并设置它们的值,Import-CliXml 命令会在键的路径对应的键中默认 属性 名称下创建值。例如:

在目标机器上,目标键如:

HKEY_CURRENT_USER\Software\Microsoft\Office.0\OneNote\OpenNoteBooks

现在将包含一个默认项,其值为:

"HKEY_CURRENT_USER\Software\Microsoft\Office.0\OneNote\OpenNoteBooks" 

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

就上下文而言,在基本层面上,我想做的事情可以通过以下方式完成:

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

然后创建包含键和值的注册表文件。

reg import OneNote.reg 

在目标机器上加载它们。显然,这对于一个简单的 "dump and restore" 操作来说很容易,但是如果希望首先使用一些逻辑来处理它们的键,那么它就不那么灵活了。

这不能按预期工作有几个原因。

首先在 Set-Item documentation 注释部分指出:

In the Registry drives, HKLM: and HKCU:, Set-Item changes the data in the (Default) value of a registry key. To create and change the names of registry keys, use New-Item and Rename-Item. To change the names and data in registry values, use New-ItemProperty, Set-ItemProperty, and Rename-ItemProperty.

因此,我们注定无法如您直觉所想的那样正常工作。

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

您最好坚持使用旧的 reg.exe 工具。它的行为已得到充分证明和预测。此外,如果您需要在此过程中调整一些值,那么解析 .reg 文件并不难。