HOWTO · PowerShell

使用 Windows PowerShell 管理注册表

本文将讨论什么是 Windows 注册表,我们如何备份和导入注册表,以及使用 PowerShell 获取注册表的属性。

本页内容

使用 PowerShell 检查注册表数据,并调用 Windows 工具导出或导入注册表项。编辑注册表可能影响 Windows 或应用程序,因此操作前应确认目标注册表项,并检查准备应用的文件。请先备份计划修改的特定注册表项;导出备份有助于保护数据,但不保证在所有情况下都能恢复。

了解 Windows 注册表和 PowerShell 路径

Windows 注册表用于存储 Windows、硬件、应用程序和用户首选项的配置。注册表由注册表项和值组成。注册表项类似文件夹,其值则保存带名称的数据。HKLM 是 HKEY_LOCAL_MACHINE 的常见缩写,其中包含整台计算机的设置;其他注册表配置单元则保存用户或当前用户的数据。

PowerShell 通过注册表提供程序公开注册表项。例如,HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion 是提供程序路径,而 Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion 是显式的、带有提供程序前缀的路径。这些路径可作为 PowerShell cmdlet(例如 Get-ItemProperty)的输入。相比之下,reg export 和 reg import 是 Windows 提供的命令,并非 PowerShell cmdlet。请根据所用命令选择它所接受的路径格式。

使用 reg export 备份注册表项

在 PowerShell 中运行 reg export,可将某个注册表项及其子项保存到 .REG 文件中。请指定要导出的注册表项和目标文件;如果目标文件可能已存在并需要覆盖,请加上 /y。先创建目标目录,并使用有权读取该注册表项的账户。例如,reg.exe export 'HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion' "$env:TEMP\CurrentVersion.reg" /y 只针对一个应用程序注册表项,而不是整个 HKLM。此 Windows 命令依赖 reg.exe 和目标注册表项,因此必须在 Windows 上运行;非 Windows 上的 PowerShell 环境无法验证该导出操作。

目标文件会保存在当前用户的临时目录中。如果要长期保留备份,请选择受保护的位置,并在修改之前确认命令报告成功且文件确实存在。成功导出只会记录所选的注册表项;它不会备份整个配置单元,也不保证能够恢复系统的所有状态。

使用 reg import 还原 .REG 文件

reg import 会将 .REG 文件中描述的注册表项和值应用到注册表。运行命令前,请检查文件内容和目标路径,并确认当前账户是否拥有所需权限。导入先前导出的文件不保证能撤销更改:文件可能未包含之后发生的更改,导入时也可能覆盖现有值或添加数据。

例如,将路径替换为你已检查并准备应用的文件后,可在 PowerShell 中运行 reg.exe import 'C:\RegBack\CurrentVersion.reg'。此 Windows 操作依赖 reg.exe 和目标文件;根据目标注册表项,可能需要在提升权限的 PowerShell 会话中运行。打开 .REG 文件或接受提示,都不能证明其内容适合应用。

使用 Get-ItemProperty 读取注册表值

将 Get-ItemProperty 与注册表提供程序路径配合使用,可以读取注册表项中存储的值。例如,在 Windows 上,Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion' | Select-Object -Property ProgramFilesDir 会读取一个常见注册表项并选取其中一个命名值。此命令需要 Windows 注册表提供程序和现存的注册表项,因此无法在非 Windows 的 PowerShell 环境中验证。接下来的独立示例演示如何从 PowerShell 对象中选取一个命名属性;它不会访问注册表。

运行此示例:

本节中的代码以及显示的标签或输出仍为英文。

$key = [pscustomobject]@{ ProgramFilesDir = 'C:\Program Files' }
Write-Output $key.ProgramFilesDir
C:\Program Files

Get-ItemProperty 会返回一个 PowerShell 对象,其属性包含注册表值;上面的 Windows 命令使用 Select-Object 限制显示的属性。具体值取决于 Windows 安装,因此请在实际管理的计算机上检查结果。Get-Item 则返回注册表项对象本身;如果需要检查该注册表项,而不是读取其值属性,可以使用它。示例输出中的属性名称保留英文,与代码和输出块的原始内容一致。

验证更改并安全操作

执行操作前,请确认路径指向预期的配置单元和注册表项。导出后,检查目标文件和命令结果。导入后,请检查文件,并使用 Get-ItemProperty 查询受影响的注册表项,确认要应用的值已经生效。只比较相关属性;命令返回对象并不能证明其他设置未发生变化。

请使用能够完成任务的最低权限账户,只有在 Windows 权限要求时才提升权限。请限制备份文件的访问权限,因为注册表导出文件可能包含配置或用户特定数据。如果更改造成问题,请按照受影响系统的适当恢复方案处理;不要假设导入一个 .REG 文件就能恢复所有先前状态。