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 の例:

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

上記の不自然な例では、「Advanced」、「CodePage」、および「Font」を表示したいのですが、PowerShell メタデータ (PS で始まる名前) は表示したくありません。悲しいことに、「PS」という名前でのフィルタリングは機能しません。MS Windows の Character Map 設定を実際に読み取ろうとしているわけではないためです。おそらく 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 句内で 1 つずつ。または、使用してみてください

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 に答える