本文目录
PowerShell管理注册表之系列文章:
使用Dir,你可以像在文件系统中那样来搜索注册表。使用注册表提供程序提供的虚拟驱动器,非常方便。驱动器HKCU:提供了KEY_CURRENT_USER根目录键的。
Cd HKCU: Dir
如果你想像下面那样列出内容,可以使用Format-List:
Dir | Format-List Dir | Format-List Name Dir | Format-List *
递归搜索
注册表提供程序不支持任何过滤器,因此你不能在Dir中使用类似于-filter这样的参数。但是参数-recurse,-include和 -exclude还是支持的。在上一章中,我们使用过它来递归地搜索文件系统。这个活在注册表中也可以这么干。比如,你想知道注册表中的那个位置包含了“PowerShell”,可以这样使用:
Dir HKCU:, HKLM: -recurse -include *PowerShell*
上面的命令会搜索HKEY_CURRENT_USER根节点和HKEY_LOCAL_MACHINE根节点。它会找出所有包括”PowerShell”单词的键。因为可能有很多键包含了单词“PowerShell”,所以使用了通配符。这样的搜索操作可能会产生错误信息,因为搜索的过程,也是读取注册表的每个子键的过程,但是部分键值没有访问权限就会报错。如果想从结果中过滤掉这些错误信息,可以使用参数-ErrorAction,并给它指定值为SilentlyContinue:
Dir HKCU:, HKLM: -recurse -include PowerShell -ErrorAction SilentlyContinue
单个注册表键
Dir获取的每一个注册表键(Microsoft.Win32.Registry 对象)对应下面的属性。
> $key = Dir HKCU: | Select-Object -first 1 > $key.GetType().FullName Microsoft.Win32.RegistryKey > $key | Get-Member -memberType *Property TypeName:Microsoft.Win32.RegistryKey Name MemberType Definition ---- ---------- ---------- Property NoteProperty System.String[] Property=System.String[] PSChildName NoteProperty System.String PSChildName=AppEvents PSDrive NoteProperty System.Management.Automation.PSDriveInfo PSDrive=HKCU PSIsContainer NoteProperty System.Boolean PSIsContainer=True PSParentPath NoteProperty System.String PSParentPath=Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER PSPath NoteProperty System.String PSPath=Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\AppEvents PSProvider NoteProperty System.Management.Automation.ProviderInfo PSProvider=Microsoft.PowerShell.Core\Registry Handle Property Microsoft.Win32.SafeHandles.SafeRegistryHandle Handle {get;} Name Property string Name {get;} SubKeyCount Property int SubKeyCount {get;} ValueCount Property int ValueCount {get;} View Property Microsoft.Win32.RegistryView View {get;}
下面的表格列出一个Microsoft.Win32.Registry(注册表键)对象的重要属性:
属性 | 描述 |
Name | 在注册编辑器中显示的键的路径 |
Property | 当前键的名称 |
PSChildName | 存储在键中的值的名称数组 |
PSDrive | 键的注册表根节点 |
PSParentPath | 父键 |
PSPath | 键的PowerShell路径,使用Dir可以查看该路径下键的内容 |
PSProvider | 提供程序的名称:注册表 |
SubKeyCount(SKC) |
子键个数 |
ValueCount (VC) |
键中的值个数 |
PSIsContainer |
总是为True |
PowerShell怎样寻址注册表
我们来仔细看下分配一个注册表键的属性。比如:下面图中通过注册表编辑器打开的HKLM:\Software\Microsoft\PowerShell\1 键,这里存放的是PowerShell的一些内部设置。
在PowerShell中使用Get-Item访问该键:
$key = Get-Item HKLM:\Software\Microsoft\PowerShell\1 $key.Name HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1 $key | Format-List ps* PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1 PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell PSChildName : 1 PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry PSIsContainer : True
果然,Name属性获取的是键的完整名称,更有意思的是这些属性的名称,前面加了‘PS’,它们将注册表键分成多个片段。
键对应的值
在上图中打开的注册表编辑器中,右边的属性列有三个值,汇报给PowerShell的只有两个值:
$key.ValueCount 2
貌似一个值丢了。仔细查看属性“Property”可以发现PowerShell记录了哪些值:
$key.Property Install PID
这些属性名对应上图中的属性名,唯独(Default)没有出现。也对,在上图中默认值为空。注册表编辑器识别为:“数值未设置”。
如果你要获取这些值的内容,可以将注册表的PS路径传递给Get-ItemProperty:
> Get-ItemProperty $key.PSPath Install : 1 PID : 89383-100-0001260-04309 PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1 PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell PSChildName : 1 PSProvider : Microsoft.PowerShell.Core\Registry
这种方式会把该键对应的所有值自动获取并输出。另外,除了一些常规属性,这些值还包括了PowerShell添加的其他属性。如果你只想获取特定的值:
# 获取注册表键的所有值 $values = Get-ItemProperty $key.PSPath # 获取Install的值: $values.Install 1 # 获取PID的值: $values.PID 89383-100-0001260-04309
如果你想获取键的所有值,但是不想包含PowerShell自动添加的属性。可以这样做:
$key = Get-Item HKLM:\Software\Microsoft\PowerShell\1 $values = Get-ItemProperty $key.PSPath foreach ($value in $key.Property) { $value + "=" + $values.$value } #输出 Install=1 PID=89383-100-0001260-04309
小技巧:如果你已经将路径定位到该注册表路径下,还可以使用另外一种方法获取所有值:
Cd HKLM:\Software\Microsoft\PowerShell\1 (Get-ItemProperty .).PID 89383-100-0001260-04309这里将”.”传递给Get-ItemProperty。当然前提条件是先得CD到目标键的路径下。
如果你想输出多个键的多个值,应当使用Dir。Dir的结果可以通过管道传递给ForEach-Object。这样,你就可以一次性获取某个键的所有子键,并且分别访问它们的属性值。下面的脚本会列出Uninstall的子键,和它们的属性DisplayName与MoreInfoURL.。这也为你提供了一个简约版已安装程序列表:
Dir hklm:\software\microsoft\windows\currentversion\uninstall | ForEach-Object { Write-Host -ForegroundColor Yellow "Installed Products:" }{ $values = Get-ItemProperty $_.PSPath; "{0:-30} {1:20}" -f $values.DisplayName, $values.MoreInfoURL }{Write-Host -ForegroundColor Yellow "Finished!"}
荔非苔注:上面的脚本写法稍微有点坑爹,其实是ForEach-Object可以接受三个脚本块用于管道的流模式处理,分别代表begin,process和end。
键的子键
在注册表编辑器中,某个键的子键在PowerShell中可以这样调用:
$key.SubKeyCount 4
Dir也能获取子键的名称。需要将PSPath这样的PowerShell路径传递给Dir:
PS> Dir $key.PSPath Hive: HKEY_LOCAL_MACHINE\Software\Microsoft\PowerShell\1 Name Property ---- -------- 0409 Install : 1 PowerShellEngine ApplicationBase : C:\Windows\System32\WindowsPowerShell\v1.0 PSCompatibleVersion : 1.0, 2.0 RuntimeVersion : v2.0.50727 ConsoleHostAssemblyName : Microsoft.PowerShell.ConsoleHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=msil ConsoleHostModuleName : C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell.ConsoleHost.dll PowerShellVersion : 2.0 PowerShellSnapIns PSConfigurationProviders ShellIds
原文链接:Managing Windows Registry
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
广播: PowerShell注册表(二)”提供程序“文件系统以外的位置 | PowerShell 中文博客
广播: PowerShell注册表(四)创建和删除键值 | PowerShell 中文博客