レジストリキーの値を取得してPowerShellの変数に配置するのを手伝ってくれる人はいますか?これまでGet-ItemProperty
とreg query
を使用しましたが、どちらも値を取得しますが、両方とも余分なテキストを追加します。レジストリキーの文字列テキストと、キーの文字列テキストのみが必要です。余分なテキストを削除する関数を作成できると確信していますが、何かが変更された場合(つまり、regキー名)はこれに影響する可能性があります。
$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で機能します(v5ではおそらく Get-ItemPropertyValue
を使用する必要があります)。
注:以下のすべてのソリューションbypassIan Kemp's の回答で説明されている問題-propertyとして使用する場合、特定の値名に明示的な引用符を使用する必要性=名前;例:.'15.0'
-値の名前はparametersとして渡され、プロパティへのアクセスはvariable;例:.$ValueName
ハリー・マーティロシアンは 彼自身の答え に関するコメントで言及している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'
スクリプトブロックを使用すると、値の名前をパラメーターとしてonceで渡すことができ、パラメーター変数($args
)をブロック内で2回使用できます。
または、単純なヘルパー関数を使用して痛みを和らげることができます。
function Get-RegValue([String] $KeyPath, [String] $ValueName) {
(Get-ItemProperty -LiteralPath $KeyPath -Name $ValueName).$ValueName
}
これが変更されているかどうか、または使用している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
で必要なプロパティを含むオブジェクトを取得し、次にそのオブジェクトから必要なプロパティの値を取得します。これにより、プロパティの値が文字列として返されます。上記の例では、「legacy」/ compatibility-mdoe powershell(1.0または2.0)のPSバージョンが提供されます。
次のコードは、特定のレジストリキーのすべての値を列挙し、それらを並べ替えて値name:コロン(:)で区切られた値のペアを返します。
$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 \
オブジェクトを作成すると、より読みやすい出力が得られ、アクセス可能なプロパティを持つオブジェクトも取得できます。
$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\