由于注册表项是 Windows PowerShell 驱动器上的项,因此处理它们的方式与处理文件和文件夹非常类似。一个关键差异是,基于注册表的 Windows PowerShell 驱动器上的每个项都是一个容器,就像文件系统驱动器上的文件夹一样。但是,注册表条目及其关联值是项的属性,而不是不同的项。
使用 Get-ChildItem 可以显示直接在注册表项中的所有项。添加可选的 Force 参数可以显示隐藏项或系统项。例如,此命令显示直接在 Windows PowerShell 驱动器 HKCU:(它对应于 HKEY_CURRENT_USER 注册表配置单元)中的项:
PS> Get-ChildItem -Path hkcu:\<o:p></o:p> <o:p> </o:p> <o:p> </o:p> Hive:Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER<o:p></o:p> <o:p> </o:p> SKC VC Name Property<o:p></o:p> --- -- ---- --------<o:p></o:p> 2 0 AppEvents {}<o:p></o:p> 7 33 Console {ColorTable00, ColorTable01, ColorTab...<o:p></o:p> 25 1 Control Panel {Opened}<o:p></o:p> 0 5 Environment {APR_ICONV_PATH, INCLUDE, LIB, TEMP...}<o:p></o:p> 1 7 Identities {Last Username, Last User ...<o:p></o:p> 4 0 Keyboard Layout {}<o:p></o:p> ...<o:p></o:p> |
<o:p> </o:p>
这些是在注册表编辑器 (Regedit.exe) 中 HKEY_CURRENT_USER 下可见的顶级项。
也可以通过指定注册表提供程序的名称后跟“::”来指定此注册表路径。注册表提供程序的全名为 Microsoft.PowerShell.Core\Registry,但是它只需简写为 Registry 即可。下列任一命令将列出直接位于 HKCU 下的内容:
Get-ChildItem -Path Registry::HKEY_CURRENT_USER<o:p></o:p> Get-ChildItem -Path Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER<o:p></o:p> Get-ChildItem -Path Registry::HKCU<o:p></o:p> Get-ChildItem -Path Microsoft.PowerShell.Core\Registry::HKCU<o:p></o:p> Get-ChildItem HKCU:<o:p></o:p> |
<o:p> </o:p>
这些命令仅列出直接包含的项,与使用 Cmd.exe 的 DIR 命令或 UNIX 外壳程序中的 ls 非常类似。若要显示包含的项,需要指定 Recurse 参数。若要列出 HKCU 中的所有注册表项,请使用以下命令(此操作可能需要极长的时间。):
Get-ChildItem -Path hkcu:\ -Recurse<o:p></o:p> |
<o:p> </o:p>
Get-ChildItem 可以通过其 Path、Filter、Include 和 Exclude 参数执行复杂的筛选功能,但是这些参数通常仅基于名称。使用 Where-Objectcmdlet 可以基于项的其他属性执行复杂的筛选。以下命令查找 HKCU:\Software 中具有不超过一个子项且正好具有四个值的所有项:
Get-ChildItem -Path HKCU:\Software -Recurse | Where-Object -FilterScript {($_.SubKeyCount -le 1) -and ($_.ValueCount -eq 4) }<o:p></o:p> |
<o:p> </o:p>
复制是使用 Copy-Item 进行的。以下命令将 HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion 及其所有属性复制到 HKCU:\,从而创建一个名为“CurrentVersion”的新项:
Copy-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion' -Destination hkcu:<o:p></o:p> |
<o:p> </o:p>
如果在注册表编辑器中或使用 Get-ChildItem 检查此新项,您将注意到新位置中没有所包含子项的副本。为了复制容器的所有内容,需要指定 Recurse 参数。若要使前面的复制命令是递归的,请使用以下命令:
Copy-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion' -Destination hkcu:-Recurse<o:p></o:p> |
<o:p> </o:p>
仍可以使用已经可用的其他工具执行文件系统复制。任何注册表编辑工具(包括 reg.exe、regini.exe 和 regedit.exe)和支持注册表编辑的 COM 对象(如 WScript.Shell 和 WMI 的 StdRegProv 类)都可以从 Windows PowerShell 内使用。
在注册表中创建新项比在文件系统中创建新项简单。由于所有的注册表项都是容器,因此无需指定项类型;只需提供显式路径即可,例如:
New-Item -Path hkcu:\software\_DeleteMe<o:p></o:p> |
<o:p> </o:p>
也可以使用基于提供程序的路径指定项:
New-Item -Path Registry::HKCU\_DeleteMe<o:p></o:p> |
<o:p> </o:p>
在本质上,删除项对于所有提供程序都是相同的。以下命令将以无提示方式删除项:
Remove-Item -Path hkcu:\Software\_DeleteMe<o:p></o:p> Remove-Item -Path 'hkcu:\key with spaces in the name'<o:p></o:p> |
<o:p> </o:p>
可以使用 Remove-Item 删除包含的项,但是如果该项包含任何其他内容,则会提示您确认删除。例如,如果尝试删除所创建的 HKCU:\CurrentVersion 子项,则会看到以下内容:
Remove-Item -Path hkcu:\CurrentVersion<o:p></o:p> <o:p> </o:p> 确认<o:p></o:p> HKCU:\CurrentVersion\AdminDebug 中的项具有子项,并且没有指定 -recurseparameter 参数。如果继续,所有子项均将随该项删除。是否确实要继续?<o:p></o:p> [Y] 是 [A] 全是 [N] 否 [L] 全否 [S] 挂起 [?] 帮助<o:p></o:p> (默认值为“Y”):<o:p></o:p> |
<o:p> </o:p>
若要删除包含的项而不出现提示,请指定 -Recurse 参数:
Remove-Item -Path HKCU:\CurrentVersion -Recurse<o:p></o:p> |
<o:p> </o:p>
若要删除 HKCU:\CurrentVersion 中的所有项但不删除 HKCU:\CurrentVersion 本身,则可以改用:
Remove-Item -Path HKCU:\CurrentVersion\* -Recurse<o:p></o:p> |
<o:p> </o:p>
因为注册表条目是项的属性(因而无法直接浏览),所以在处理它们时需要采用稍微不同的方法。
可以使用许多不同的方法检查注册表条目。最简单的方法是获取与项关联的属性名称。例如,若要查看注册表项 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion 中条目的名称,请使用 Get-Item。注册表项具有一个通用名称为“Property”的属性,该属性是项中注册表条目的列表。以下命令选择 Property 属性,并扩展项以便在列表中显示它们:
PS> Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion | Select-Object -ExpandProperty Property<o:p></o:p> DevicePath<o:p></o:p> MediaPathUnexpanded<o:p></o:p> ProgramFilesDir<o:p></o:p> CommonFilesDir<o:p></o:p> ProductId<o:p></o:p> |
<o:p> </o:p>
若要以可读性更强的形式查看注册表条目,请使用 Get-ItemProperty:
PS> Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion<o:p></o:p> <o:p> </o:p> <o:p> </o:p> PSPath :Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SO<o:p></o:p> FTWARE\Microsoft\Windows\CurrentVersion<o:p></o:p> PSParentPath :Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SO<o:p></o:p> FTWARE\Microsoft\Windows<o:p></o:p> PSChildName :CurrentVersion<o:p></o:p> PSDrive :HKLM<o:p></o:p> PSProvider :Microsoft.PowerShell.Core\Registry<o:p></o:p> DevicePath :C:\WINDOWS\inf<o:p></o:p> MediaPathUnexpanded :C:\WINDOWS\Media<o:p></o:p> ProgramFilesDir :C:\Program Files<o:p></o:p> CommonFilesDir :C:\Program Files\Common Files<o:p></o:p> ProductId : 76487-338-1167776-22465<o:p></o:p> WallPaperDir :C:\WINDOWS\Web\Wallpaper<o:p></o:p> MediaPath :C:\WINDOWS\Media<o:p></o:p> ProgramFilesPath :C:\Program Files<o:p></o:p> PF_AccessoriesName :Accessories<o:p></o:p> (default) :<o:p></o:p> |
<o:p> </o:p>
项的 Windows PowerShell 相关属性均以“PS”为前缀,如 PSPath、PSParentPath、PSChildName 和 PSProvider。
可以使用“.”符号来表示当前位置。可以使用 Set-Location 首先转到 CurrentVersion 注册表容器:
Set-Location -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion<o:p></o:p> |
<o:p> </o:p>
或者,可以将内置 HKLM PSDrive 与 Set-Location 一起使用:
Set-Location -Path hklm:\SOFTWARE\Microsoft\Windows\CurrentVersion<o:p></o:p> |
<o:p> </o:p>
然后,可以使用“.”符号表示当前位置以列出属性,而不指定完整路径:
PS> Get-ItemProperty -Path .<o:p></o:p> ...<o:p></o:p> DevicePath :C:\WINDOWS\inf<o:p></o:p> MediaPathUnexpanded :C:\WINDOWS\Media<o:p></o:p> ProgramFilesDir :C:\Program Files<o:p></o:p> ...<o:p></o:p> |
<o:p> </o:p>
路径扩展名与它在文件系统中的使用方法相同,因此可以使用 Get-ItemProperty -Path ..\Help 从此位置获取 HKLM:\SOFTWARE\Microsoft\Windows\Help 的 ItemProperty 列表。
若要检索注册表项中的特定条目,请使用下列几种可能的方法之一。以下示例在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion 中查找 DevicePath 的值。
在使用 Get-ItemProperty 时,使用 Path 参数指定项的名称,并使用 Name 参数指定 DevicePath 条目的名称。
PS> Get-ItemProperty -Path HKLM:\Software\Microsoft\Windows\CurrentVersion -Name DevicePath<o:p></o:p> <o:p> </o:p> <o:p> </o:p> PSPath :Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\<o:p></o:p> Microsoft\Windows\CurrentVersion<o:p></o:p> PSParentPath :Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\<o:p></o:p> Microsoft\Windows<o:p></o:p> PSChildName :CurrentVersion<o:p></o:p> PSDrive :HKLM<o:p></o:p> PSProvider :Microsoft.PowerShell.Core\Registry<o:p></o:p> DevicePath :C:\WINDOWS\inf<o:p></o:p> |
<o:p> </o:p>
此命令返回标准的 Windows PowerShell 属性以及 DevicePath 属性。
<!----><!----><!---->请注意: <o:p></o:p>
虽然 Get-ItemProperty 具有 Filter、Include 和 Exclude 参数,但是无法使用它们按属性名称进行筛选。这些参数引用注册表项(它们是项路径),而不是引用注册表条目(它们是项属性)。<o:p></o:p>
<o:p> </o:p>
另一种方法是使用 Reg.exe 命令行工具。若要获取 reg.exe 的帮助,请在命令提示符下键入 reg.exe /?。若要查找 DevicePath 条目,请使用 reg.exe,如以下命令所示:
PS> reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion /v DevicePath<o:p></o:p> <o:p> </o:p> ! REG.EXE VERSION 3.0<o:p></o:p> <o:p> </o:p> HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion<o:p></o:p> DevicePath REG_EXPAND_SZ %SystemRoot%\inf<o:p></o:p> |
<o:p> </o:p>
也可以使用 WshShell COM 对象查找一些注册表条目,尽管此方法不适用于大二进制数据或包括诸如“\”的字符的注册表条目名称。使用 \ 分隔符将属性名称追加到项路径:
PS> (New-Object -ComObject WScript.Shell).RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DevicePath")<o:p></o:p> %SystemRoot%\inf<o:p></o:p> |
<o:p> </o:p>
若要将名为“PowerShellPath”的新条目添加到 CurrentVersion 项,请将 New-ItemProperty 与项的路径、条目名称以及条目的值一起使用。在以下示例中,我们将采用 Windows PowerShell 变量 $PSHome 的值,该变量存储 Windows PowerShell 安装目录的路径。
使用以下命令可以将新条目添加到项,而且该命令还返回有关新条目的信息:
PS> New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PowerShellPath -PropertyType String -Value $PSHome<o:p></o:p> <o:p> </o:p> <o:p> </o:p> PSPath :Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWAR<o:p></o:p> E\Microsoft\Windows\CurrentVersion<o:p></o:p> PSParentPath :Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWAR<o:p></o:p> E\Microsoft\Windows<o:p></o:p> PSChildName :CurrentVersion<o:p></o:p> PSDrive :HKLM<o:p></o:p> PSProvider :Microsoft.PowerShell.Core\Registry<o:p></o:p> PowerShellPath :C:\Program Files\Windows PowerShell\v1.0<o:p></o:p> |
<o:p> </o:p>
PropertyType 必须是下表中 Microsoft.Win32.RegistryValueKind 枚举成员的名称:
<o:p> </o:p>
PropertyType 值 |
含义 |
Binary<o:p></o:p> |
二进制数据 |
DWord<o:p></o:p> |
一个有效的 UInt32 数字 |
ExpandString<o:p></o:p> |
一个可以包含动态扩展的环境变量的字符串 |
MultiString<o:p></o:p> |
多行字符串 |
String |