使用注册表条目

本示例仅适用于 Windows 平台。

因为注册表条目是项的属性,因此不能直接浏览,我们在处理它们时需要采取稍微不同的方式。

列出注册表条目

可采用许多不同的方法检查注册表条目。 最简单的方法是获取与某个项相关联的属性名称。 例如,若要查看注册表项 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion 中的条目名称,请使用 Get-Item。 注册表项有一个通用名称为“Property”的属性,它是项中的注册表条目列表。 以下命令选择 Property 属性并扩展这些项,以便它们可在列表中显示:

Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion |
    Select-Object -ExpandProperty Property
DevicePath
MediaPathUnexpanded
ProgramFilesDir
CommonFilesDir
ProductId

若要在可读性更强的窗体中查看注册表条目,请使用 Get-ItemProperty

Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
ProgramFilesDir          : C:\Program Files
CommonFilesDir           : C:\Program Files\Common Files
ProgramFilesDir (x86)    : C:\Program Files (x86)
CommonFilesDir (x86)     : C:\Program Files (x86)\Common Files
CommonW6432Dir           : C:\Program Files\Common Files
DevicePath               : C:\WINDOWS\inf
MediaPathUnexpanded      : C:\WINDOWS\Media
ProgramFilesPath         : C:\Program Files
ProgramW6432Dir          : C:\Program Files
SM_ConfigureProgramsName : Set Program Access and Defaults
SM_GamesName             : Games
PSPath                   : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWA
                           RE\Microsoft\Windows\CurrentVersion
PSParentPath             : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWA
                           RE\Microsoft\Windows
PSChildName              : CurrentVersion
PSDrive                  : HKLM
PSProvider               : Microsoft.PowerShell.Core\Registry

该项的 Windows PowerShell 相关的属性全都带有“PS”前缀,例如 PSPathPSParentPathPSChildNamePSProvider

可以将 *.* 表示法用于引用当前位置。 可以先使用 Set-Location 以更改为 CurrentVersion 注册表容器:

Set-Location -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

另外,可以将内置 HKLM: PSDrive 与 Set-Location 结合使用:

Set-Location -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion

然后,可以将 . 表示法用于当前位置以列出属性,而无需指定完整路径:

Get-ItemProperty -Path .
...
DevicePath          : C:\WINDOWS\inf
MediaPathUnexpanded : C:\WINDOWS\Media
ProgramFilesDir     : C:\Program Files
...

路径扩展的工作方式与其在文件系统中的工作方式相同,因此在此位置中,可以使用 Get-ItemProperty -Path ..\Help 来获取 HKLM:\SOFTWARE\Microsoft\Windows\Help 的 ItemProperty 列表。

获取单个注册表条目

如果你希望在注册表项中检索特定条目,可以使用几种可能的方法之一。 本示例查找 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion 中的 DevicePath 的值。

通过使用 Get-ItemProperty,可使用 Path 参数指定键的名称,使用 Name 参数指定 DevicePath 条目的名称。

Get-ItemProperty -Path HKLM:\Software\Microsoft\Windows\CurrentVersion -Name DevicePath
DevicePath   : C:\WINDOWS\inf
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows
PSChildName  : CurrentVersion
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry

此命令返回标准 Windows PowerShell 属性以及 DevicePath 属性。

备注

尽管 Get-ItemProperty 具有 Filter、Include 和 Exclude 参数,但它们不能用于按属性名称进行筛选。 这些参数引用注册表项(即项路径),而不引用注册表条目(即项属性)。

另一种方法是使用 reg.exe 命令行工具。 有关 reg.exe 的帮助,请在命令提示符下键入 reg.exe /?。 若要查找 DevicePath 条目,请使用 reg.exe,如以下命令所示:

reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion /v DevicePath
! REG.EXE VERSION 3.0

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
    DevicePath  REG_EXPAND_SZ   %SystemRoot%\inf

还可使用 WshShell COM 对象查找某些注册表条目,尽管此方法对大型二进制数据或包含诸如反斜杠 (\) 字符的注册表条目名称不起作用。 将属性名称附加到带有 \ 分隔符的项路径:

(New-Object -ComObject WScript.Shell).RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DevicePath")
%SystemRoot%\inf

设置单个注册表条目

如果希望在注册表项中更改特定条目,可以使用几种可能的方法之一。 此示例修改 HKEY_CURRENT_USER\Environment 下的 Path 条目。 Path 条目指定在哪里可以找到可执行文件。

  1. 使用 Get-ItemProperty 检索 Path 条目的当前值。
  2. 添加新值,将其与 ; 分离。
  3. Set-ItemProperty 与指定的键、条目名称和值结合使用,以修改注册表条目。
$value = Get-ItemProperty -Path HKCU:\Environment -Name Path
$newpath = $value.Path += ";C:\src\bin\"
Set-ItemProperty -Path HKCU:\Environment -Name Path -Value $newpath

备注

尽管 Set-ItemProperty 具有 Filter、Include 和 Exclude 参数,但它们不能用于按属性名称进行筛选。 这些参数引用注册表项(即项路径),而不引用注册表条目(即项属性)。

另一种方法是使用 Reg.exe 命令行工具。 有关 reg.exe 的帮助,请在命令提示符下键入 reg.exe /?

下面的示例通过删除在上面的示例添加的路径来更改 Path 条目。 Get-ItemProperty 仍可用于检索当前值,以避免必须解析从 reg query 返回的字符串。 SubString 和 LastIndexOf 方法用于检索添加到 Path 条目的最后一个路径。

$value = Get-ItemProperty -Path HKCU:\Environment -Name Path
$newpath = $value.Path.SubString(0, $value.Path.LastIndexOf(';'))
reg add HKCU\Environment /v Path /d $newpath /f
The operation completed successfully.

创建新注册表条目

若要将名为“PowerShellPath”的新条目添加到 CurrentVersion 键,请将 New-ItemProperty 与该键的路径、条目名称和条目的值一起使用。 对于此示例,我们将采用 Windows PowerShell 变量 $PSHome 的值,该变量可存储 Windows PowerShell 的安装目录的路径。

可以使用以下命令将新条目添加到项,该命令还会返回有关新条目的信息:

$newItemPropertySplat = @{
    Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
    Name = 'PowerShellPath'
    PropertyType = 'String'
    Value = $PSHome
}
New-ItemProperty @newItemPropertySplat
PSPath         : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
PSParentPath   : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
PSChildName    : CurrentVersion
PSDrive        : HKLM
PSProvider     : Microsoft.PowerShell.Core\Registry
PowerShellPath : C:\Program Files\Windows PowerShell\v1.0

PropertyType 必须是以下表格中的 Microsoft.Win32.RegistryValueKind 枚举成员的名称:

  • String - 用于 REG_SZ 值。 将 [System.String] 对象传递给 Value 参数
  • ExpandString - 用于 REG_EXPAND_SZ 值。 将 [System.String] 对象传递给 Value 参数。 该字符串应该包含对检索值时扩展的环境变量的未扩展引用。
  • Binary - 用于 REG_BINARY 值。 将 [System.Byte[]] 对象传递给 Value 参数
  • DWord - 用于 REG_DWORD 值。 将 [System.Int32] 对象传递给 Value 参数
  • MultiString - 用于 REG_MULTI_SZ 值。 将 [System.String[]] 对象传递给 Value 参数
  • QWord - 用于 REG_QWORD 值。 将 [System.Int64] 对象传递给 Value 参数

你可以通过为 Path 参数指定一组值来将注册表条目添加到多个位置。

$newItemPropertySplat = @{
    Name = 'PowerShellPath'
    PropertyType = 'String'
    Value = $PSHome
    Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion',
           'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion'
}
New-ItemProperty @newItemPropertySplat

还可以替代预先存在的注册表条目值,方法是将 Force 参数添加到任何 New-ItemProperty 命令。

以下示例演示如何创建各种类型的新注册表项。 注册表值是在 HKEY_CURRENT_USER\Software 下名为 MySoftwareKey 的新项中创建的。 $key 变量用于存储新的项对象。

$key = New-Item -Path HKCU:\Software -Name MySoftwareKey
$newItemPropertySplat = @{
    Path = $key.PSPath
    Name = 'DefaultFolders'
    PropertyType = 'MultiString'
    Value = 'Home', 'Temp', 'Publish'
}
New-ItemProperty @newItemPropertySplat
DefaultFolders : {Home, Temp, Publish}
PSPath         : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\MySoftwareKey
PSParentPath   : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software
PSChildName    : MySoftwareKey
PSProvider     : Microsoft.PowerShell.Core\Registry

可以在后续命令中使用项对象的 PSPath 属性

New-ItemProperty -Path $key.PSPath -Name MaxAllowed -PropertyType QWord -Value 1024
MaxAllowed   : 1024
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\MySoftwareKey
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software
PSChildName  : MySoftwareKey
PSProvider   : Microsoft.PowerShell.Core\Registry

还可以通过管道将 $key 传递给 New-ItemProperty,以便为项添加值。

$date = Get-Date -Format 'dd-MMM-yyyy'
$newItemPropertySplat = @{
    Name = 'BinaryDate'
    PropertyType = 'Binary'
    Value = ([System.Text.Encoding]::UTF8.GetBytes($date))
}
$key | New-ItemProperty @newItemPropertySplat
BinaryDate   : {51, 49, 45, 74…}
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\MySoftwareKey
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software
PSChildName  : MySoftwareKey
PSProvider   : Microsoft.PowerShell.Core\Registry

显示 $key 的内容会显示新项。

$key
    Hive: HKEY_CURRENT_USER\Software

Name                           Property
----                           --------
MySoftwareKey                  DefaultFolders : {Home, Temp, Publish}
                               MaxAllowed     : 1024
                               BinaryDate     : {51, 49, 45, 74…}

以下示例显示每种注册表项的值类型:

$key.GetValueNames() | Select-Object @{n='ValueName';e={$_}},
     @{n='ValueKind';e={$key.GetValueKind($_)}},
     @{n='Type';e={$key.GetValue($_).GetType()}},
     @{n='Value';e={$key.GetValue($_)}}
ValueName        ValueKind Type            Value
---------        --------- ----            -----
DefaultFolders MultiString System.String[] {Home, Temp, Publish}
MaxAllowed           QWord System.Int64    1024
BinaryDate          Binary System.Byte[]   {51, 49, 45, 74…}

重命名注册表条目

若要将 PowerShellPath 条目重命名为“PSHome”,请使用 Rename-ItemProperty

$renameItemPropertySplat = @{
    Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
    Name = 'PowerShellPath'
    NewName = 'PSHome'
}
Rename-ItemProperty @renameItemPropertySplat

若要显示重命名的值,请将 PassThru 参数添加到该命令。

$renameItemPropertySplat = @{
    Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
    Name = 'PowerShellPath'
    NewName = 'PSHome'
    PassThru = $true
}
Rename-ItemProperty @renameItemPropertySplat

删除注册表条目

若要删除 PSHome 和 PowerShellPath 注册表条目,请使用 Remove-ItemProperty

Remove-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PSHome
Remove-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PowerShellPath