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

时间:2015-06-10 17:02:14

标签: windows powershell registry

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

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

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

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

这可以通过regedit完成,但我很好奇PowerShell是如何完成的。

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

在目标计算机上,目标密钥如:

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 

要创建包含键值的注册表文件,那么。

reg import OneNote.reg 

在目标计算机上加载它们。显然,这对于简单的转储和恢复很容易。但是,如果希望首先使用某些逻辑来处理它们的键,那么它的灵活性就会降低。

1 个答案:

答案 0 :(得分:1)

有几个原因导致这种情况不能按预期发挥作用。

首先在Set-Item documentation备注部分中说明:

  

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

因此,我们注定要注意这一点,因为你没有直觉地思考。

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

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