PowerShell基础教程(24)——处理注册表项

PowerShell基础教程(24)——处理注册表项             <o:p></o:p>

由于注册表项是 Windows PowerShell 驱动器上的项因此处理它们的方式与处理文件和文件夹非常类似。一个关键差异是,基于注册表的 Windows PowerShell 驱动器上的每个项都是一个容器,就像文件系统驱动器上的文件夹一样。但是,注册表条目及其关联值是项的属性,而不是不同的项。

列出注册表项的所有子项<o:p></o:p>

使用 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 可以通过其 PathFilterInclude 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>

复制项<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.exeregini.exe regedit.exe)和支持注册表编辑的 COM 对象(如 WScript.Shell WMI StdRegProv 类)都可以从 Windows PowerShell 内使用。

创建项<o:p></o:p>

在注册表中创建新项比在文件系统中创建新项简单。由于所有的注册表项都是容器,因此无需指定项类型;只需提供显式路径即可,例如:

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>

删除项<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>

删除特定项下的所有项<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>

处理注册表条目             <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为前缀 PSPathPSParentPathPSChildName 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 列表。

获取单个注册表条目<o:p></o:p>

若要检索注册表项中的特定条目请使用下列几种可能的方法之一。以下示例在 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 具有 FilterInclude 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>

创建新的注册表条目<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

你可能感兴趣的:(C++,c,windows,Microsoft,powershell)