5

在 Win2008R2 上的 PowerShell 2.0 中,如果我想从注册表项中获得与“REG QUERY”相同的输出,以可读的格式,使用来自特定注册表项的值,如下所示:

reg query hkcu\Software\Microsoft\CharMap

HKEY_CURRENT_USER\Software\Microsoft\CharMap
    Advanced    REG_DWORD    0x0
    CodePage    REG_SZ       Unicode
    Font        REG_SZ       Arial

我将如何使用 PowerShell 做到这一点?PowerShell 的行为再次让我感到困惑。

获取项目属性示例:

Get-ItemProperty HKCU:\Software\Microsoft\CharMap


PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\CharMap
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft
PSChildName  : CharMap
PSDrive      : HKCU
PSProvider   : Microsoft.PowerShell.Core\Registry
Advanced     : 0
CodePage     : Unicode
Font         : Arial

在我上面的人为示例中,我想查看“高级”、“代码页”和“字体”,而不是任何 PowerShell 元数据(以 PS 开头的名称)。遗憾的是,过滤名称“PS”对我不起作用,因为我并没有真正尝试阅读 MS Windows 字符映射设置,我只是选择它们作为可能每个使用 Windows 的人都有的注册表项,所以每个人都可以看到多么彻底不同的使用PowerShell的体验是看注册表,比方说REG.EXE程序。任何人可能只想从注册表项中获取注册表值而不获取任何元数据是有原因的,并且任何在 PowerShell 中编写工具的人都可能希望完成这个简单的任务。

我希望输出类似于REG QUERY但仍采用本机 PowerShell 格式,而不仅仅是扁平化为文本。我已经用谷歌搜索并搜索了所有内容,似乎无法弄清楚这一点。

例如,我希望能够这样做:

  $all = GetRealRegistryKeysFrom(  HKCU:\Software\Microsoft\CharMap )
  for ($item in $all) { ... }

更新使用下面的功能,效果很好......

例子Get-RegistryKeyPropertiesAndValues -path HKCU:\Software\.....

4

4 回答 4

6

这是一个技巧:

Get-ItemProperty HKCU:\Software\Microsoft\CharMap  | out-string -stream | ? { $_ -NOTMATCH '^ps.+' }

问题是当一个属性以PS. 处理此代码,您可以详细说明以排除这些:

PSPath
PSParentPath
PSChildName
PSDrive
PSProvider

...在where子句中一一对应。或者只是尝试使用

get-item hkcu\Software\Microsoft\CharMap

有一个脚本可以满足您的需要。

在此处更新复制的脚本:

Function Get-RegistryKeyPropertiesAndValues
{
  <#
    Get-RegistryKeyPropertiesAndValues -path 'HKCU:\Volatile Environment'
    Http://www.ScriptingGuys.com/blog
  #>

 Param(

  [Parameter(Mandatory=$true)]
  [string]$path)

 Push-Location
 Set-Location -Path $path
 Get-Item . |
 Select-Object -ExpandProperty property |
 ForEach-Object {
 New-Object psobject -Property @{"property"=$_;
    "Value" = (Get-ItemProperty -Path . -Name $_).$_}}
 Pop-Location
} #end function Get-RegistryKeyPropertiesAndValues
于 2012-11-12T20:08:13.990 回答
1

以下代码将枚举某个注册表项的所有值,对它们进行排序并返回值名称:由冒号 (:) 分隔的值对:

$path = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework';

Get-Item -Path $path | Select-Object -ExpandProperty Property | Sort | % {
    $command = [String]::Format('(Get-ItemProperty -Path "{0}" -Name "{1}")."{1}"', $path, $_);
    $value = Invoke-Expression -Command $command;
    $_ + ' : ' + $value; };

像这样:

DbgJITDebugLaunchSetting : 16

DbgManagedDebugger : "C:\Windows\system32\vsjitdebugger.exe" PID %d APPDOM %d EXTEXT "%s" EVTHDL %d

安装根目录:C:\Windows\Microsoft.NET\Framework\

于 2016-02-14T06:04:07.720 回答
1

这是我调用 get-itemproperty2.ps1 的 get-itemproperty 替代脚本:

# get-childitem skips top level key, use get-item
param([parameter(ValueFromPipeline)]$key)

process { 
  $valuenames = $key.getvaluenames() 

  if ($valuenames) { 
    $valuenames | foreach {
      $value = $_
      [pscustomobject] @{
        Path = $key -replace 'HKEY_CURRENT_USER',
          'HKCU:' -replace 'HKEY_LOCAL_MACHINE','HKLM:'
        Name = $Value
        Value = $Key.GetValue($Value)
        Type = $Key.GetValueKind($Value)
      }
    }
  } else {
    [pscustomobject] @{
      Path = $key -replace 'HKEY_CURRENT_USER',
        'HKCU:' -replace 'HKEY_LOCAL_MACHINE','HKLM:'
        Name = ''
        Value = ''
        Type = ''
    }
  }
}

例子:

get-item hkcu:\key1 | get-itemproperty2

Path       Name  Value  Type
----       ----  -----  ----
HKCU:\key1 name1     1 DWord
于 2019-07-15T14:16:08.140 回答
-1

不好了 ...

powershell gp 'HKCU:Software\Microsoft\CharMap'|more +7
于 2013-07-31T14:19:34.670 回答