web-dev-qa-db-ja.com

powershellを使用してレジストリキーの値と値のみを取得する方法

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

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

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

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

93
Andy Arismendi

これらの回答はどれも、値の名前にスペース、ドット、または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 を使用する必要があります)。

22
Ian Kemp

注:以下のすべてのソリューション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
}
14
mklement0

これが変更されているかどうか、または使用している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
6
M Jeremy Carter

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

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

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

2
Frode F.

2つのプロパティを持つキー\SQLを指定します:

enter image description here

プロパティ名がドット表記を使用することになるかどうかがわからなかった場合、次のケースで「MSSQLSERVER」を取得します。

$regkey_property_name = 'MSSQLSERVER'
$regkey = get-item -Path 'HKLM:\Software\Microsoft\Microsoft SQL Server\Instance Names\SQL'
$regkey.GetValue($regkey_property_name)
1
Adam

次のコードは、特定のレジストリキーのすべての値を列挙し、それらを並べ替えて値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 \

1

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

$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\
0
Steve Fellwock