我正在尝试导出各种软件应用程序的选择性注册表项,首选项和配置,然后将它们导入到新机器上。
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
的输出,则没有提供注册表值类型信息,例如 DWORD
、QWORD
等,因此任何使用它作为输入的工具都不知道如何正确构造键的值,因为没有类型提示。
你最好坚持使用旧的reg.exe
工具。它的行为得到了很好的证明和可预测。此外,如果您需要在此过程中调整一些值,解析.reg
文件也不是太难。