77

レジストリキーの値を取得してPowerShellの変数に配置するのを手伝ってくれる人はいますか?これまで私は使用Get-ItemPropertyしてきreg queryましたが、どちらも値を取得しますが、どちらも余分なテキストを追加します。レジストリキーの文字列テキストと、キーの文字列テキストのみが必要です。余分なテキストを取り除く関数を作成できると確信していますが、何かが変更された場合(つまり、regキー名)、これに影響する可能性があります。

4

9 に答える 9

118
$key = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
(Get-ItemProperty -Path $key -Name ProgramFilesDir).ProgramFilesDir

私はこれがプロバイダーがこのように実装された方法が好きではありませんでした:/

基本的に、すべてのレジストリ値を、、、、およびプロパティを持つオブジェクトにし、次に実際の値のプロパティにしPSCustomObjectますPsPath。そのため、名前でアイテムを要求した場合でも、その値を取得するには、もう一度名前を使用する必要があります。PsParentPathPsChildnamePSDrivePSProvider

于 2013-03-19T22:42:30.993 に答える
30

値の名前にスペース、ドット、またはPowerShellで予約されているその他の文字が含まれている場合、これらの回答はいずれも機能しません。その場合、http://blog.danskingdom.com/accessing-powershell-variables-with-periods-in-their-name/のように、名前を二重引用符で囲む必要があります。例:

PS> Get-ItemProperty Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS\VS7

14.0         : C:\Program Files (x86)\Microsoft Visual Studio 14.0\
12.0         : C:\Program Files (x86)\Microsoft Visual Studio 12.0\
11.0         : C:\Program Files (x86)\Microsoft Visual Studio 11.0\
15.0         : C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS\V
               S7
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS
PSChildName  : VS7
PSProvider   : Microsoft.PowerShell.Core\Registry

14.0、12.0、11.0、15.0のいずれかの値にアクセスする場合、受け入れられた回答の解決策は機能しません。出力は得られません。

PS> (Get-ItemProperty Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS\VS7 -Name 15.0).15.0
PS>

動作するのは、値の名前を引用することです。これは、安全のためにとにかく実行する必要があります。

PS> (Get-ItemProperty "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS\VS7" -Name "15.0")."15.0"
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\
PS> 

したがって、受け入れられた回答は次のように変更する必要があります。

PS> $key = "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\SxS\VS7"
PS> $value = "15.0"
PS> (Get-ItemProperty -Path $key -Name $value).$value
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\
PS> 

これは、PowerShell 2.0から5.0で機能します(ただし、おそらくGet-ItemPropertyValuev5で使用する必要があります)。

于 2017-05-11T10:16:09.193 に答える
26

Harry Martyrossianは、自分の回答に対するコメントで、
Get-ItemPropertyValueコマンドレットがPowershell v5に導入されたことに言及しています。これにより、問題が解決されます。

PS> Get-ItemPropertyValue 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion' 'ProgramFilesDir'
C:\Program Files

PowerShell v4の代替::

これは、値の名前を繰り返す必要をなくしながら効率を維持する試みですが、それでも少し面倒です。

& { 
  (Get-ItemProperty `
      -LiteralPath HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion `
      -Name $args 
  ).$args 
} ProgramFilesDir

スクリプトブロックを使用すると、値の名前をパラメーターとして1回渡すことができ、パラメーター変数($args)をブロック内で2回使用するだけで済みます。

あるいは、単純なヘルパー関数で痛みを和らげることができます。

function Get-RegValue([String] $KeyPath, [String] $ValueName) {
  (Get-ItemProperty -LiteralPath $KeyPath -Name $ValueName).$ValueName
}

注:上記のすべての解決策は、 Ian Kempの回答で説明されている問題を回避します。プロパティ名として使用する場合は、特定の値の名前に明示的な引用符を使用する必要があります。たとえば、-値の名前はパラメータとして渡され、プロパティへのアクセスは変数を介して行われるためです。例えば、.'15.0'.$ValueName


他の答えについて:

  • Andy Arismendiの有益な回答は、値データを効率的に取得するために値の名前を繰り返さなければならないという煩わしさを説明しています。
  • M Jeremy Carterの有用な回答はより便利ですが、多数のプロパティを持つオブジェクトを作成する必要があるため、多数の値を持つキーのパフォーマンスの落とし穴になる可能性があります。
于 2016-02-18T05:09:28.903 に答える
7

これが変更されたかどうか、または使用しているPSのバージョンと関係があるかどうかはわかりませんが、Andyの例を使用すると、-Nameパラメーターを削除しても、regアイテムの値を取得できます。 :

PS C:\> $key = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
PS C:\> (Get-ItemProperty -Path $key).ProgramFilesDir
C:\Program Files


PS C:\> $psversiontable.psversion

Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      -1     -1
于 2013-08-14T15:02:47.543 に答える
4

\SQL2つのプロパティを持つキーが与えられます:

ここに画像の説明を入力してください

ドット表記を使用するプロパティ名がわからない場合は、次の場合に「MSSQLSERVER」を取得します。

$regkey_property_name = 'MSSQLSERVER'
$regkey = get-item -Path 'HKLM:\Software\Microsoft\Microsoft SQL Server\Instance Names\SQL'
$regkey.GetValue($regkey_property_name)
于 2018-04-19T21:07:20.053 に答える
2

ここで具体的にする必要があります。私の知る限り、レジストリのキーはプロパティの「フォルダ」です。それで、あなたはプロパティの値を取得することを意味しましたか?もしそうなら、このようなことを試してください:

(Get-ItemProperty HKLM:\Software\Microsoft\PowerShell\1\PowerShellEngine -Name PowerShellVersion).PowerShellVersion

まず、必要なプロパティを含むオブジェクトを取得しGet-ItemProperty、次にそのオブジェクトから必要なプロパティの値を取得します。これにより、プロパティの値が文字列として返されます。上記の例は、「レガシー」/互換性-mdoe powershell(1.0または2.0)のPSバージョンを示しています。

于 2013-03-19T22:41:59.857 に答える
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
InstallRoot : C:\Windows\Microsoft.NET\Framework\
于 2016-02-13T06:03:48.460 に答える
1

この機能がどのバージョンで提供されたかはわかりませんが、次のようなものを使用して、配列内の複数の子レジストリエントリのすべてのプロパティを返すことができます。

$InstalledSoftware = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | ForEach-Object {Get-ItemProperty "Registry::$_"}

グーグルが関連する理由で私をここに連れてきたのでこれを追加するだけで、私は最終的にレジストリを浚渫するための上記のワンライナーを思いついた。

于 2020-01-31T22:09:26.650 に答える
0

オブジェクトを作成すると、より読みやすい出力が得られ、アクセスできるプロパティを持つオブジェクトも得られます。

$path = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework'
$obj  = New-Object -TypeName psobject

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
$obj | Add-Member -MemberType NoteProperty -Name $_ -Value $value}

Write-Output $obj | fl

サンプル出力:InstallRoot:C:\ Windows \ Microsoft.NET \ Framework \

そして、オブジェクト:$ obj.InstallRoot = C:\ Windows \ Microsoft.NET \ Framework \

問題の真実は、これが必要以上に複雑であるということです。これははるかに優れた例であり、はるかに単純です。

$path = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework'
$objReg = Get-ItemProperty -Path $path | Select -Property *

$ objRegは、各レジストリエントリがプロパティ名であるカスタムオブジェクトになりました。フォーマットされたリストは、次の方法で表示できます。

write-output $objReg

InstallRoot        : C:\Windows\Microsoft.NET\Framework\
DbgManagedDebugger : "C:\windows\system32\vsjitdebugger.exe"

そして、オブジェクト自体にアクセスできます。

$objReg.InstallRoot
C:\Windows\Microsoft.NET\Framework\
于 2017-02-23T15:19:34.747 に答える