レジストリキーの値を取得してPowerShellの変数に配置するのを手伝ってくれる人はいますか?これまで私は使用Get-ItemProperty
してきreg query
ましたが、どちらも値を取得しますが、どちらも余分なテキストを追加します。レジストリキーの文字列テキストと、キーの文字列テキストのみが必要です。余分なテキストを取り除く関数を作成できると確信していますが、何かが変更された場合(つまり、regキー名)、これに影響する可能性があります。
9 に答える
$key = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
(Get-ItemProperty -Path $key -Name ProgramFilesDir).ProgramFilesDir
私はこれがプロバイダーがこのように実装された方法が好きではありませんでした:/
基本的に、すべてのレジストリ値を、、、、およびプロパティを持つオブジェクトにし、次に実際の値のプロパティにしPSCustomObject
ますPsPath
。そのため、名前でアイテムを要求した場合でも、その値を取得するには、もう一度名前を使用する必要があります。PsParentPath
PsChildname
PSDrive
PSProvider
値の名前にスペース、ドット、または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-ItemPropertyValue
v5で使用する必要があります)。
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の有用な回答はより便利ですが、多数のプロパティを持つオブジェクトを作成する必要があるため、多数の値を持つキーのパフォーマンスの落とし穴になる可能性があります。
これが変更されたかどうか、または使用している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
ここで具体的にする必要があります。私の知る限り、レジストリのキーはプロパティの「フォルダ」です。それで、あなたはプロパティの値を取得することを意味しましたか?もしそうなら、このようなことを試してください:
(Get-ItemProperty HKLM:\Software\Microsoft\PowerShell\1\PowerShellEngine -Name PowerShellVersion).PowerShellVersion
まず、必要なプロパティを含むオブジェクトを取得しGet-ItemProperty
、次にそのオブジェクトから必要なプロパティの値を取得します。これにより、プロパティの値が文字列として返されます。上記の例は、「レガシー」/互換性-mdoe powershell(1.0または2.0)のPSバージョンを示しています。
次のコードは、特定のレジストリキーのすべての値を列挙し、それらを並べ替えて、値の名前を返します。コロン(:)で区切られた値のペア:
$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\
この機能がどのバージョンで提供されたかはわかりませんが、次のようなものを使用して、配列内の複数の子レジストリエントリのすべてのプロパティを返すことができます。
$InstalledSoftware = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" | ForEach-Object {Get-ItemProperty "Registry::$_"}
グーグルが関連する理由で私をここに連れてきたのでこれを追加するだけで、私は最終的にレジストリを浚渫するための上記のワンライナーを思いついた。
オブジェクトを作成すると、より読みやすい出力が得られ、アクセスできるプロパティを持つオブジェクトも得られます。
$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\