PowerShellでレジストリを編集する方法

toc目次

はじめに

PowerShellからレジストリを編集する方法のメモです。

※ レジストリの編集を誤るとWindowsが起動しなくなる場合もありますので、実行する場合は自己責任でお願いいたします。

キーの記載方法

PowerShellではルートキーを「HKEY_CURRENT_USER」→「HKCU:」のように変換して記載します。

ルートキー キーの記載
HKEY_CLASSES_ROOT HKCR:
HKEY_CURRENT_USER HKCU:
HKEY_LOCAL_MACHINE HKLM:
HKEY_USERS HKU:
HKEY_CURRENT_CONFIG HKCC:

HKU:」「HKCR:」「HKCC:」はデフォルトで未割り当てのため、使用する際は下記コマンドで割り当てを行います。

New-PSDrive -Name HKCC -PSProvider Registry -Root HKEY_CURRENT_CONFIG
New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT
New-PSDrive -Name HKU  -PSProvider Registry -Root HKEY_USERS

エントリの種類

-PropertyTypeでエントリの種類を指定する際は以下を使用します。

エントリの種類 -PropertyTypeの指定 備考
文字列値 String REG_SZ
バイナリ値 Binary REG_BINARY
DWORD(32ビット)値 DWord REG_DWORD
QWORD(64ビット)値 QWord REG_QWORD
複数行文字列値 MultiString REG_MULTI_SZ
展開可能な文字列値 ExpandString REG_EXPAND_SZ

主な処理コマンド一覧

処理 コマンド
キーの作成 New-Item ${path}
キーの取得 Get-ItemProperty ${path}
キー名の変更 Rename-Item ${path} -NewName ${newName}
キーの削除 Remove-Item ${path}
エントリの作成 New-ItemProperty ${path} -Name ${name} -PropertyType ${type}
-Value ${value}
エントリの取得 Get-ItemProperty ${path} -Name ${name}
エントリ名の変更 Rename-ItemProperty ${path} -Name ${name} -NewName ${newName}
エントリ値の変更 Set-ItemProperty ${path} -Name ${name} -Value ${value}
エントリの削除 Remove-ItemProperty ${path} -Name ${name}

実行例

キーの作成

キーの作成はNew-Itemを使用します。

# 「HKEY_CURRENT_USER\TEST」を作成
New-Item 'HKCU:\TEST'

エントリの作成

エントリの作成はNew-ItemPropertyを使用します。

# 「HKEY_CURRENT_USER\TEST」にエントリを追加
$path = 'HKCU:\TEST'

# 文字列値(String)の作成
New-ItemProperty $path -Name "data1" -PropertyType "String" -Value "Sample"

# バイナリ値はバイナリの配列を使用する
$value = @()
$value += [byte]0x61
$value += [byte]0x62
$value += [byte]0x63
New-ItemProperty $path -Name "data2" -PropertyType "Binary" -Value $value

# 複数行文字列値は文字列の配列を使用する
$value = "aaa", "bbb", "ccc"
New-ItemProperty $path -Name "data3" -PropertyType "MultiString" -Value $value
実行結果 実行結果

エントリ名の修正、エントリ値の修正

エントリ名の修正はRename-ItemProperty、エントリ値の修正の修正はSet-ItemPropertyを使用します。

$path = 'HKCU:\TEST'

# エントリ名の修正
Rename-ItemProperty $path -Name "data1" -NewName "data100"

# エントリ値の修正
Set-ItemProperty $path -Name "data3" -Value ("ddd", "eee", "fff")
実行結果 実行結果

エントリの削除

エントリ値の削除はRemove-ItemPropertyを使用します。

$path = 'HKCU:\TEST'

# エントリ値の削除
Remove-ItemProperty $path -Name "data2"
実行結果 実行結果

エントリの追加について

キーが存在しない場合、エントリの追加はエラーとなります。

$path = 'HKCU:\TEST\AAA\BBB\CCC'
New-ItemProperty $path -Name "data1" -PropertyType "String" -Value "Sample"
New-ItemProperty : パス 'HKCU:\TEST\AAA\BBB\CCC' が存在しないため検出できません。

キーが存在しなくてもエントリを追加したい場合は独自に関数を作成する必要があります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
function Set-Registry($path, $entryName, $entryType, $entryValue) {
    if ( -Not (Test-Path $path)) {
            # キーが存在しない場合は作成
            New-Item $path -Force
    }

    $result = Get-ItemProperty $path -Name $entryName -ErrorAction SilentlyContinue
    if ($result -eq $null) {
        # エントリが存在しない場合はエントリを作成
        New-ItemProperty $path -Name $entryName -PropertyType $entryType -Value $entryValue
    } else {
        # エントリが存在する場合はエントリを上書き
        Set-ItemProperty $path -Name $entryName -Value $entryValue
    }
}
$path = 'HKCU:\TEST\AAA\BBB\CCC'
Set-Registry $path "data1" "String" "Sample"

参考