レジストリ エントリの操作
このサンプルは Windows プラットフォームにのみ適用されます。
レジストリ エントリはキーのプロパティであり直接参照できないため、利用するときは少し異なる方法を取る必要があります。
レジストリ エントリの一覧表示
レジストリ エントリを確認するには、多くのさまざまな方法があります。 最も簡単な方法は、キーに関連付けられているプロパティの名前を取得することです。 たとえば、レジストリ キー HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
のエントリの名前を確認するには、Get-Item
を使います。 レジストリ キーは、キーのレジストリ エントリの一覧であり、"Property"という汎用的な名前のプロパティを持っています。 次のコマンドは、Property プロパティを選択し、一覧に表示されるように項目を拡張します。
Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion |
Select-Object -ExpandProperty Property
DevicePath
MediaPathUnexpanded
ProgramFilesDir
CommonFilesDir
ProductId
レジストリ エントリをさらに読みやすい形式で表示するには、Get-ItemProperty
を使います。
Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
ProgramFilesDir : C:\Program Files
CommonFilesDir : C:\Program Files\Common Files
ProgramFilesDir (x86) : C:\Program Files (x86)
CommonFilesDir (x86) : C:\Program Files (x86)\Common Files
CommonW6432Dir : C:\Program Files\Common Files
DevicePath : C:\WINDOWS\inf
MediaPathUnexpanded : C:\WINDOWS\Media
ProgramFilesPath : C:\Program Files
ProgramW6432Dir : C:\Program Files
SM_ConfigureProgramsName : Set Program Access and Defaults
SM_GamesName : Games
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWA
RE\Microsoft\Windows\CurrentVersion
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWA
RE\Microsoft\Windows
PSChildName : CurrentVersion
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
キーの Windows PowerShell 関連のプロパティには、PSPath、PSParentPath、PSChildName、および PSProvider のように、すべて先頭に "PS" が付きます。
現在の場所を参照するために、*.*
表記を使用できます。 Set-Location
を使用して、まず CurrentVersion レジストリのコンテナーに変更します。
Set-Location -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
または、Set-Location
と共に組み込みの HKLM:
PSDrive を使用できます。
Set-Location -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion
次に、現在の場所に対して .
表記を使用して、完全パスを指定することなくプロパティを一覧表示できます。
Get-ItemProperty -Path .
...
DevicePath : C:\WINDOWS\inf
MediaPathUnexpanded : C:\WINDOWS\Media
ProgramFilesDir : C:\Program Files
...
パスの展開は、ファイルシステム内の場合と同様に機能します。そのため、この場所から Get-ItemProperty -Path ..\Help
を使って HKLM:\SOFTWARE\Microsoft\Windows\Help
の ItemProperty の一覧を取得できます。
1 つのレジストリ エントリの取得
レジストリ キーの特定のエントリを取得する場合は、いくつかの可能なアプローチのいずれかを使用できます。 この例では、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
の DevicePath の値を検索します。
Get-ItemProperty
を使用する場合、Path パラメーターを使用してキーの名前を指定し、Name パラメーターを使用して DevicePath のエントリの名前を指定します。
Get-ItemProperty -Path HKLM:\Software\Microsoft\Windows\CurrentVersion -Name DevicePath
DevicePath : C:\WINDOWS\inf
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows
PSChildName : CurrentVersion
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
このコマンドは、標準の Windows PowerShell のプロパティと DevicePath プロパティを返します。
注意
Get-ItemProperty
には Filter、Include、Exclude パラメーターが含まれていますが、これらはプロパティ名でフィルター処理するためには使えません。 これらのパラメーターはレジストリ キー (項目のパス) を参照するものであり、レジストリ エントリ (項目のプロパティ) を参照しているのではありません。
別のオプションとして、reg.exe
コマンド ライン ツールを使用することもできます。 reg.exe
のヘルプを表示するには、コマンド プロンプトで「reg.exe /?
」と入力します。 DevicePath エントリを検索するには、次のコマンドに示すように reg.exe
を使用します。
reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion /v DevicePath
! REG.EXE VERSION 3.0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
DevicePath REG_EXPAND_SZ %SystemRoot%\inf
また、WshShell COM オブジェクトを使っていくつかのレジストリ エントリを検索することもできますが、大きなバイナリ データや、バックスラッシュ (\
) のような文字が含まれるレジストリ エントリ名では、この方法は機能しません。 プロパティ名を区切り記号 \
と共に項目のパスに追加します。
(New-Object -ComObject WScript.Shell).RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DevicePath")
%SystemRoot%\inf
1 つのレジストリ エントリの設定
レジストリ キーの特定のエントリを変更する場合は、いくつかある可能なアプローチのいずれかを使用できます。 この例では、HKEY_CURRENT_USER\Environment
下の Path エントリを変更します。 Path エントリでは、実行可能ファイルを検索する場所を指定します。
Get-ItemProperty
を使って Path エントリの現在の値を取得します。;
で区切りながら新しい値を追加します。- 指定したキー、エントリ名、およびレジストリ エントリを変更する値と共に
Set-ItemProperty
を使います。
$value = Get-ItemProperty -Path HKCU:\Environment -Name Path
$newpath = $value.Path += ";C:\src\bin\"
Set-ItemProperty -Path HKCU:\Environment -Name Path -Value $newpath
注意
Set-ItemProperty
には Filter、Include、Exclude パラメーターが含まれていますが、これらはプロパティ名でフィルター処理するためには使えません。 これらのパラメーターはレジストリ キー (項目のパス) を参照し、レジストリ エントリ (項目のプロパティ) を参照するのではありません。
別のオプションとして、Reg.exe コマンド ライン ツールを使用することもできます。 reg.exe のヘルプを表示するには、コマンド プロンプトで reg.exe /?
と入力します。
次の例では、上記の例で追加したパスを削除することで Path エントリを変更します。
reg query
から返された文字列を解析しなくて済むようにするため、Get-ItemProperty
を引き続き使って現在の値を取得します。 Path エントリに追加された最後のパスを取得するために、SubString および LastIndexOf メソッドを使います。
$value = Get-ItemProperty -Path HKCU:\Environment -Name Path
$newpath = $value.Path.SubString(0, $value.Path.LastIndexOf(';'))
reg add HKCU\Environment /v Path /d $newpath /f
The operation completed successfully.
新しいレジストリ エントリの作成
"PowerShellPath" という名前の新しいエントリを CurrentVersion キーに追加するには、キーのパス、エントリ名、エントリの値と共に New-ItemProperty
を使用します。 この例では、Windows PowerShell の変数 $PSHome
の値を取得します。これには、Windows PowerShell のインストール ディレクトリへのパスが格納されます。
キーに新しいエントリを追加するには、次のコマンドを使用します。このコマンドは、新しいエントリに関する情報も返します。
$newItemPropertySplat = @{
Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
Name = 'PowerShellPath'
PropertyType = 'String'
Value = $PSHome
}
New-ItemProperty @newItemPropertySplat
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
PSChildName : CurrentVersion
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
PowerShellPath : C:\Program Files\Windows PowerShell\v1.0
PropertyType は、次の表の Microsoft.Win32.RegistryValueKind 列挙体のメンバーの名前にする必要があります。
String
- REG_SZ 値に使用済み。[System.String]
オブジェクトを値パラメーターに渡します。ExpandString
- REG_EXPAND_SZ 値に使用済み。[System.String]
オブジェクトを値パラメーターに渡します。 文字列は、値が読み出されるときに展開される環境変数の展開されない参照を含む必要があります。Binary
- REG_BINARY 値に使用済み。[System.Byte[]]
オブジェクトを値パラメーターに渡します。DWord
- REG_DWORD 値に使用済み。[System.Int32]
オブジェクトを値パラメーターに渡します。MultiString
- REG_MULTI_SZ 値に使用済み。[System.String[]]
オブジェクトを値パラメーターに渡します。QWord
- REG_QWORD 値に使用済み。[System.Int64]
オブジェクトを値パラメーターに渡します。
Path パラメーターに値の配列を指定して、レジストリ エントリを複数の場所に追加できます。
$newItemPropertySplat = @{
Name = 'PowerShellPath'
PropertyType = 'String'
Value = $PSHome
Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion',
'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion'
}
New-ItemProperty @newItemPropertySplat
また、Force パラメーターを任意の New-ItemProperty
コマンドに追加して、既存のレジストリ エントリの値を上書きすることもできます。
次の例は、さまざまな種類の新しいレジストリ エントリの作成方法を示しています。 レジストリ値は、HKEY_CURRENT_USER\Software
の下の MySoftwareKey という新しいキーで作成されます。 変数 $key
は、新しいキー オブジェクトの格納に使用されます。
$key = New-Item -Path HKCU:\Software -Name MySoftwareKey
$newItemPropertySplat = @{
Path = $key.PSPath
Name = 'DefaultFolders'
PropertyType = 'MultiString'
Value = 'Home', 'Temp', 'Publish'
}
New-ItemProperty @newItemPropertySplat
DefaultFolders : {Home, Temp, Publish}
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\MySoftwareKey
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software
PSChildName : MySoftwareKey
PSProvider : Microsoft.PowerShell.Core\Registry
キー オブジェクトの PSPath プロパティは、後続のコマンドで使用できます。
New-ItemProperty -Path $key.PSPath -Name MaxAllowed -PropertyType QWord -Value 1024
MaxAllowed : 1024
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\MySoftwareKey
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software
PSChildName : MySoftwareKey
PSProvider : Microsoft.PowerShell.Core\Registry
キーに値を追加するために、$key
を New-ItemProperty
にパイプできます。
$date = Get-Date -Format 'dd-MMM-yyyy'
$newItemPropertySplat = @{
Name = 'BinaryDate'
PropertyType = 'Binary'
Value = ([System.Text.Encoding]::UTF8.GetBytes($date))
}
$key | New-ItemProperty @newItemPropertySplat
BinaryDate : {51, 49, 45, 74…}
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\MySoftwareKey
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software
PSChildName : MySoftwareKey
PSProvider : Microsoft.PowerShell.Core\Registry
$key
のコンテンツの表示は、新しいエントリを示しています。
$key
Hive: HKEY_CURRENT_USER\Software
Name Property
---- --------
MySoftwareKey DefaultFolders : {Home, Temp, Publish}
MaxAllowed : 1024
BinaryDate : {51, 49, 45, 74…}
次の例は、レジストリ エントリの種類ごとの値の型を示しています。
$key.GetValueNames() | Select-Object @{n='ValueName';e={$_}},
@{n='ValueKind';e={$key.GetValueKind($_)}},
@{n='Type';e={$key.GetValue($_).GetType()}},
@{n='Value';e={$key.GetValue($_)}}
ValueName ValueKind Type Value
--------- --------- ---- -----
DefaultFolders MultiString System.String[] {Home, Temp, Publish}
MaxAllowed QWord System.Int64 1024
BinaryDate Binary System.Byte[] {51, 49, 45, 74…}
レジストリ エントリの名前変更
PowerShellPath エントリの名前を "PSHome" に変更するには、Rename-ItemProperty
を使用します。
$renameItemPropertySplat = @{
Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
Name = 'PowerShellPath'
NewName = 'PSHome'
}
Rename-ItemProperty @renameItemPropertySplat
名前が変更された値を表示するには、PassThru パラメーターをコマンドに追加します。
$renameItemPropertySplat = @{
Path = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion'
Name = 'PowerShellPath'
NewName = 'PSHome'
PassThru = $true
}
Rename-ItemProperty @renameItemPropertySplat
レジストリ エントリの削除
PSHome と PowerShellPath の両方のレジストリ エントリを削除するには、Remove-ItemProperty
を使用します。
Remove-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PSHome
Remove-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PowerShellPath
PowerShell