レジストリを操作する際、グラフィカルユーザーインタフェースのレジストリエディターだと定型的な処理や多数のリモートPCのメンテナンスには不便だ。そんなときはWindows OSに標準装備されているコマンド(CUI)ベースのレジストリ操作ツール「reg」コマンドを活用しよう。
対象:Windows 10/Windows 11、Windows Server 2016/Windows Server 2019/Windows Server 2022
Windows OSでは、「レジストリ」に設定されている値などに基づいて、システム各部が動作するようになっている。Windows OSの設定を変える場合、通常は標準装備の設定ツールやコマンドなどで設定すると、それが最終的にレジストリに反映されることで、Windows OSの挙動が変わる。そのため、レジストリを直接操作する必要はないことが多い。
しかし、中にはレジストリを直接操作しなければならない設定項目もある。
レジストリを操作するためには、一般的にはグラフィカルユーザーインタフェース(GUI)ベースの「レジストリエディター(regedit.exe)」を使うことが多い。しかし何度も同じ処理を実行する場合や、多数のPCに(リモートから)同じ設定を施すならば、コマンドラインの方が便利である。
Windows OSでは、「reg(reg.exe)」コマンドやPowerShellが標準で利用できる。本Tech TIPSではregコマンドの基本的な使い方を紹介する。
具体的な操作方法を説明する前に、ごく簡単にレジストリについて説明しておこう。
レジストリとは、Windowsシステム内部の各種設定値を保存しておくためのデータベースである。システムの設定やソフトウェアの構成内容、ユーザーごとの環境設定など、Windows OS内で動作しているさまざまなコンポーネントがこのレジストリを参照して動作している。
レジストリ中には、ツリー状の「キー」が構築されている。トップにあるのが「ルートキー」、その下にあるのが「サブキー」だ。それらの中に、幾つかの「値」が設定されている。値は「名前」「種類(型)」「データ」で構成されている。
レジストリの詳細についてはWindows OS入門「システム設定を集中管理するレジストリ」を参照していただきたい。
ここからは、実際に「reg」コマンドでレジストリを操作する方法を説明していく。
regコマンドには幾つかのサブコマンドがあり、例えばレジストリエントリの内容を表示させるには「reg query <パラメーター列>」を使う。regコマンドで利用できるサブコマンドは次の通りである。
コマンド | 機能 | リモート |
---|---|---|
reg query | レジストリツリーや値の表示 | 可 |
reg add | レジストリキーや値の追加、既存の値の更新 | 可 |
reg delete | 指定されたキーや値の削除 | 可 |
reg copy | レジストリツリーのコピー | 可 |
reg compare | 指定された2カ所のレジストリツリーの比較 | 可 |
reg export | 指定されたキーや値の.regファイルへの書き出し。GUIのレジストリエディターのエクスポートと同じ | 不可 |
reg import | reg exportで書き出されたレジストリ値の書き戻し。GUIのレジストリエディターのインポートと同じ | 不可 |
reg save | レジストリツリーの保存 | (可) |
reg restore | reg saveで保存されたレジストリの、元の場所への復元 | 不可 |
reg load | reg saveで保存されたレジストリの、元とは異なる場所へのロード/復元 | 不可 |
reg unload | reg load操作で読み込まれたレジストリのセクションのアンロード(削除) | 不可 |
reg flags | (Windows Vista以降で実装された)「レジストリ仮想化」設定の変更/確認 | 不可 |
regコマンドのサブコマンドとその機能 「リモート」の欄は、リモートPCのレジストリを操作できるかどうかを表している。「可」となっている場合は、レジストリのキー名の先頭にコンピュータ名を指定できる。 |
regコマンドの使い方は、コマンドプロンプト上で「reg /?」を実行すると確認できる。各サブコマンドについては、さらに「reg add /?」「reg delete /?」などとすれば、使い方やサンプルが表示される。
なおアクセス対象のキーによっては、管理者権限などが必要になることがあるので、その場合は管理者としてコマンドプロンプトを起動し、そこでregコマンドを実行すること。
regコマンドを利用する際には、そのパラメーターとしてレジストリキーの名前を指定する必要がある。
レジストリには、目的に応じて幾つかの「ルートキー」が存在する。例えばシステム全体に関わる設定は「HKEY_LOCAL_MACHINE」、現在のユーザーの設定は「HKEY_CURRENT_USER」などである。しかし、これらは非常に長いので、以下のような省略形式を利用することもできる。
ルートキーの正式名称 | 省略形式 | 用途 |
---|---|---|
HKEY_LOCAL_MACHINE | HKLM | システム全体に関わる設定 |
HKEY_USERS | HKU | ユーザーごとの設定 |
HKEY_CURRENT_USER | HKCU | 現在のユーザーの設定 |
HKEY_CLASSES_ROOT | HKCR | COMオブジェクトの登録情報 |
レジストリのルートキーの正式名称と省略形式(主要なもののみ) |
この省略形式を使うと、例えば「HKEY_CURRENT_USER\Environment」は「HKCU\Environment」と短く、簡潔に記述できる。
まずは基本的な使い方として、レジストリの特定のキーや値の内容を調べてみる。それには以下のコマンドラインを実行する。
reg query <キー名>
例えばWindows OSの「ユーザー環境変数」の値は「HKEY_CURRENT_USER\Environment(=HKCU\Environmentと同じ)」に保存されているので、この内容を見てみよう(環境変数についてはTech TIPS「Path環境変数を設定/編集して、独自のコマンドを実行可能にする」も参照)。キー名などの指定は大文字でも小文字でもよい。
■キーを正式名称で指定する場合
reg query HKEY_CURRENT_USER\Environment
■キーを省略形式で指定する場合
reg query HKCU\Environment
「/s」オプションを付けると、「dir /s」コマンドのように(Tech TIPS「dirコマンドでファイル名の一覧を取得する」参照)、指定したキー以下にある全てのサブキーとその値の情報が表示される。場合によっては非常に大量に表示されるので注意すること。
キー全体ではなく、その中に含まれる特定の値の情報だけを表示させたければ、以下のコマンドラインを実行する。
reg query <キー名> /v <値の名前>
キー名や値の名前に空白文字や特殊文字が含まれている場合は、ダブルクオート記号で囲むこと。また「v*」や「var?」のようなワイルドカードを指定すると、該当する値のみが表示される。
例えば、以下のレジストリキーに保存されている「システム環境変数」を取り出すとしよう。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
この中から環境変数「windir」の値を取り出すには、以下のコマンドラインを実行する。
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v windir
レジストリキー名は長くて覚えにくく、そのまま扱うには面倒だ。
そこで、レジストリエディターで対象となるキーやサブキーを開いているなら、キー名を右クリックして、メニューから[キー名のコピー]を選ぶと、そのキーのパスを簡単にクリップボードにコピーできる。Tech TIPS「レジストリキーのパス文字列をクリップボードにコピーする」も参照のこと。
レジストリに新しいサブキーや値を追加したり、値を変更したりするには、以下のコマンドラインを実行する。
reg add <キー名> /v <値の名前> /t <値の種類 > /d <値のデータ>
値の種類やデータを省略するとREG_SZ型で空の文字列が設定される。また、キー名しか指定しないと、そのサブキーが作成される。
値の種類(値の型)として利用できるデータ型は次の通り。
種類(型) | 説明 |
---|---|
REG_NONE | 値無し型(名前のみでデータを持たないもの) |
REG_SZ | 文字列データ(改行なしの単一行) |
REG_MULTI_SZ | 複数行に渡る文字列データ |
REG_EXPAND_SZ | 展開可能な文字列(環境変数参照などを含む文字列)データ |
REG_BINARY | 可変長のバイナリデータ |
REG_DWORD | 32bitの整数値データ |
REG_QWORD | 64bitの整数値データ |
値の種類(値の型) 値にはこれらの種類(データ型)がある。何が利用できるか、どのように利用されるかは、レジストリを利用するプログラム次第である。間違った種類を設定するとプログラムやWindows OSが正しく動作しなくなる。 |
すでに存在する値やキー名の場合は、上書きするかどうかの確認メッセージが表示され、「y」と答えると実際に更新される(「/f」オプションを付けると、確認なしで実行される)。
例えばユーザー環境変数に新しい変数「myvar」、値「Hello!」を設定するなら、以下のコマンドラインを実行する。
reg add HKCU\Environment /v myvar /t reg_sz /d "Hello!"
環境変数中で「%var%」のように、他の変数を参照/展開させたい場合は、REG_SZ型ではなくREG_EXPAND_SZ型を使って、以下のようにセットすること。
reg add HKCU\Environment /v myvar2 /t reg_expand_sz /d ^%var^%
「^%」は、「%」をコマンドライン側で展開させないようにするための表記方法だ。
レジストリの中にある値を削除するには、以下のコマンドラインを実行する。
reg delete <キー名> /v <値の名前>
ワイルドカード指定は使えない。実行すると確認メッセージが表示されるので、「y」と入力すると実際に削除が実行される(「/f」オプションを付けると、確認なしで実行される)。レジストリにはアンドゥ機能などはないので、注意して実行すること。
値の名前を省略して、以下のようにすると、指定したキー全体が削除対象となる。
reg delete <キー名>
指定したキーだけでなく、その中にある値や、さらに下位のサブキーも含めて全部削除されるので、十分注意して実行すること。
リモートPCのレジストリをregコマンドで操作する場合は、キーの先頭に「\\<コンピュータ名>\」を付ければよい。以下は「server1」というコンピュータ名のリモートPCのレジストリを確認するコマンドラインの例である。
reg query \\server1\HKLM\SOFTWARE\Microsoft
注意が必要なのは、リモートからレジストリを操作する場合は「CURRENT_USER(現在ログオンしているユーザー)」という概念がなく、HKLMとHKUのみが利用できるという点だ。
ルートキー(正式名称) | ルートキー(省略形式) | リモートからの参照 |
---|---|---|
HKEY_LOCAL_MACHINE | HKLM | 可能 |
HKEY_USERS | HKU | 可能 |
HKEY_CURRENT_USER | HKCU | 不可能 |
HKEY_CLASSES_ROOT | HKCR | 不可能 |
リモートから参照できるルートキーと参照できないルートキー |
詳細はTech TIPS「リモートからレジストリを操作する」を参照していただきたい。
「reg export」を使うと、指定したサブキー以下のレジストリツリーをまとめて.regファイルとして保存しておける。保存したファイルは「reg import」でインポートできる。
この.regファイルは、GUI版のレジストリエディターでレジストリを書き出したときに作成される.regファイルと同じである。そのため、レジストリエディターでインポートしたり、エクスプローラでダブルクリックして実行(レジストリを設定)したりできる。キーや値の削除なども可能だ。
ただし、この.regファイルをテキストエディタで手動作成するなら、保存時の文字コードに注意する必要がある。.regファイルは、BOM付きのUTF-16 LE(リトルエンディアン)形式でなければならない(BOMについてはTech Basics「UTF-8」参照)。メモ帳なら文字コードとして「UTF-16 LE」あるいは「Unicode」を選択すること。
詳細はTech TIPS「.regファイルを『手書き』してレジストリに読み込ませる方法」を参照していただきたい。
「reg flags」を使うと、「レジストリ仮想化」の設定を変更/確認できる。レジストリの仮想化とはUAC(ユーザーアカウント制御)と連動して、管理者だけがアクセスできるレジストリエントリへのアクセスを制御することで、アプリケーションを正常に実行できるようにする機能のことである。
また64bit(x64)版Windows OSでは、内部的には32bitアプリと、64bitアプリ向けの2種類のレジストリを持っていて、必要に応じてアクセス先を切り替えている。これはレジストリの「リダイレクト」と呼ばれる機能によるものだ。同じアプリでも、32bit版と64bit版で、それぞれ異なる設定をレジストリに破綻なく保存できる。実際にはほとんどの部分が共通で、一部のレジストリのみが独立して管理されている。
ほとんどのケースではその違いを意識する必要はない。しかし例外的に、使っているアプリがどちらのレジストリをアクセスしているかを意識して操作しなければならないこともある。アクセス先のレジストリのセットを明示的に切り替えるには、regコマンドのオプションとして「/reg:32」「/reg:64」のいずれかを指定する。
詳細はWindows OS入門「レジストリのリダイレクトと仮想化およびレジストリ操作ツール」を参照していただきたい。
regコマンドには、ここまでの説明の他にも幾つか、レジストリを管理するための機能が用意されている。それらの機能を簡単に紹介しよう。
「reg copy」や「reg compare」を使うと、レジストリツリーをコピーしたり、比較したりできる。ローカルPCのレジストリ内だけでなく、2つのPC間でのリモートコピーもできる。
「reg save」を使うと、指定したサブキー以下のレジストリツリーをまとめてファイルに保存できる。保存されたファイルは、「reg restore」で同じ場所へ復元できる。レジストリエディターで「.hiv(ハイブ)」形式で保存/復元するのと同じだ。レジストリキーのアクセス権や最終更新日時なども保存/復元できる。詳細はTech TIPS「特定のレジストリキー以下を素早くバックアップする」を参照していただきたい。
「reg save」で保存したレジストリツリーは、「reg load」コマンドで元とは異なる場所へロード/復元できる。保存されているレジストリ情報を確認したり、参照したりしながら、現在のレジストリ設定を変更する、といった用途に利用できる。ロードしたレジストリの情報は、「reg unload」で解除(削除)できる。詳細はTech TIPS「Windowsでレジストリハイブをロードしてオフラインでレジストリを閲覧・編集する」を参照していただきたい。
regコマンドとバッチファイルを組み合わせると、一定の手順でレジストリ操作を自動化できる。ただ、バッチファイルだと細かい制御が難しいため、処理が複雑になればなるほどバッチファイルでは記述しきれなくなる。
そのような場合はPowerShellでレジストリを操作することも、選択肢の一つとして検討した方がよい。古い記事だが、Tech TIPS「PowerShellでレジストリを操作する」が参考になるだろう。
■この記事と関連性の高い別の記事
■更新履歴
【2024/02/07】Windows 11などに対応しました。
【2019/03/07】最新状況に合わせて、内容を更新しました。
【2014/09/01】Windows 7以降および64bit版のWindows OSの情報を追記しました。
【2004/02/21】初版公開(対象OSはWindows 2000/Windows XP/Windows Server 2003)。
Copyright© Digital Advantage Corp. All Rights Reserved.