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



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

Get-ChildItem Registry::HKEY_CURRENT_USERSoftwareMicrosoftOffice14.0OneNote -Recurse | Export-Clixml -Depth 3 -Path OneNote.xml

然后在另一台计算机上使用不同的时间反转此过程

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

这似乎不起作用,但原因并不明显。从概念上讲,感觉好像这样的事情应该有效。

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

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

Import-CliXml 命令不是在键不存在时创建键并设置其值,而是在与键路径对应的键中的默认属性名称下创建值。 例如:

在目标计算机上,目标键,例如:

HKEY_CURRENT_USERSoftwareMicrosoftOffice14.0OneNoteOpenNoteBooks

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

"HKEY_CURRENT_USERSoftwareMicrosoftOffice14.0OneNoteOpenNoteBooks" 

而不是源键中的预期属性。

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

reg export HKEY_CURRENT_USERSoftwareMicrosoftOffice14.0OneNote OneNote.reg 

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

reg import OneNote.reg 

在目标计算机上加载它们。 显然,这对于简单的"转储和还原"操作来说很容易,但是如果希望首先使用某些逻辑来处理它们的密钥,则灵活性较低。

这无法按预期工作有几个原因。

首先,在Set-Item文档注释部分,它指出:

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

因此,我们注定不会像您直觉上认为的那样工作。

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

你最好坚持使用旧的reg.exe工具。它的行为得到了很好的证明和可预测。此外,如果您需要在此过程中调整一些值,解析.reg文件也不是太难。

最新更新