レジストリ エントリの操作

このサンプルは 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 関連のプロパティには、PSPathPSParentPathPSChildName、および 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\HelpItemProperty の一覧を取得できます。

1 つのレジストリ エントリの取得

レジストリ キーの特定のエントリを取得する場合は、いくつかの可能なアプローチのいずれかを使用できます。 この例では、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersionDevicePath の値を検索します。

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 には FilterIncludeExclude パラメーターが含まれていますが、これらはプロパティ名でフィルター処理するためには使えません。 これらのパラメーターはレジストリ キー (項目のパス) を参照するものであり、レジストリ エントリ (項目のプロパティ) を参照しているのではありません。

別のオプションとして、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 エントリでは、実行可能ファイルを検索する場所を指定します。

  1. Get-ItemProperty を使って Path エントリの現在の値を取得します。
  2. ; で区切りながら新しい値を追加します。
  3. 指定したキー、エントリ名、およびレジストリ エントリを変更する値と共に 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 には FilterIncludeExclude パラメーターが含まれていますが、これらはプロパティ名でフィルター処理するためには使えません。 これらのパラメーターはレジストリ キー (項目のパス) を参照し、レジストリ エントリ (項目のプロパティ) を参照するのではありません。

別のオプションとして、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

キーに値を追加するために、$keyNew-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