Programming Field

Reg Compare - DOS/コマンドプロンプト コマンド一覧

[Windows NT系/XP 以降] レジストリのキーに含まれるデータの比較を行います。Regの操作の1つです。

構文

reg[.exe] compare <key1> <key2>
    [/oa | /od | /os | /on] [/v <var-name> | /ve] [/s] [/reg:[32|64]]

オプション一覧

<key1>, <key2>

それぞれキー名を指定します。具体的な指定方法は「キー名の指定方法について」をご覧ください。

なお、キー名はどちらも完全パスで指定しますが、いずれかのキーが存在しない場合はエラーとなります。

/oa | /od | /os | /on

比較結果の内容を出力するオプションを指定します。いずれか1つのみ指定可能です。省略した場合は「/od」が使われるようです。

オプション(参考)意味
/oaOutput All一致・不一致両方の内容をすべて出力します。
/odOutput Diff不一致であった内容すべてを出力します。
/osOutput Same一致した内容すべてを出力します。
/onOutput Nothing一致・不一致両方の内容を出力せず、「一致」「不一致」の結果のみを出力します。

※ 「この操作を正しく終了しました。」は必ず出力されます。出力を完全に抑制したい場合は出力リダイレクト「NUL」を利用する必要があります。
※ このオプションは「/v」や「/ve」より前に指定する必要があります。

/v <var-name> | /ve

「/v <var-name>」を指定した場合は、<var-name> にそれぞれのキーに存在する比較対象の値の名前を指定します。名前は単体の名前である必要があり、パス名を含めることはできません(パスは <key> に含めます)。

「/ve」を指定した場合は、指定したキーにある「既定」(または「標準」、無名)の値の取得を行います。

/s

<key1><key2> (以下親キー)それぞれに含まれるすべてのサブキーおよびその中の値も比較対象とします。どちらかの親キーにのみ含まれるサブキーがあった場合は、そのサブキー自身が「不一致」の扱いとなり、そのサブキーや値に対する比較は省略されます。

なお、「/v」または「/ve」とともに用いることは出来ません。

/reg:[32|64]

64ビット版と32ビット版(WOW64)の環境がある場合、「/reg:32」を指定すると32ビット版アプリケーションが使用するレジストリデータ(HKLMの場合は「HKLM\Software\WOW6432Node」以下など)、「/reg:64」を指定すると64ビット版アプリケーションが使用するレジストリデータを参照します。

なおこのオプションを省略した場合は、実行されるReg.exeが64ビット版であれば64ビット版、32ビット版(%SystemRoot%\SysWOW64 以下にあるもの)であれば32ビット版のレジストリを参照します。何らかのアプリケーションのレジストリデータを参照する場合は、そのアプリケーションの32ビット/64ビットが分かっているのであれば明示的にこのオプションを指定して曖昧さを回避することができます。

※ Reg.exeが32ビット版であっても「/reg:64」によって64ビット版のレジストリを参照することができます。
※ 64ビット版Reg.exeであれば、32ビット版のレジストリを参照する際に直接「HKLM\Software\WOW6432Node」以下などのキーを指定することも可能です。

解説

Regの「COMPARE」コマンドはレジストリ内のキー同士を比較する際に用います。指定した2つの親キーに対し、以下のパターンで比較を行うことができます。

  1. 指定した特定の値の比較 -- 「/v <var-name>」または「/ve」を指定して実行
  2. キー直下にあるすべての値同士の比較 -- 値関連(/v および /ve)と「/s」を指定せずに実行
  3. キー直下にあるすべてのサブキーおよび値同士の比較 -- 「/s」を指定して実行

値の比較については、バイナリレベルでのデータの比較だけでなく、値の種別が一致しているかどうかも考慮されます。例えば、

HKCU\Software\Hoge App
└ (val) Root = REG_SZ "D:\home"
HKCU\Software\Piyo App
└ (val) Root = REG_EXPAND_SZ "D:\home"

というキー同士(「HKCU\Software\Hoge App」「HKCU\Software\Piyo App」といずれも「Root」という値を持つが、値の種別のみ異なる)を比較した場合は「不一致」とみなされます。

比較結果の出力は、「/oa」「/od」「/os」のいずれかのオプションを指定した場合(省略した場合は「/od」扱い)に、それぞれに対応する具体的な比較内容が出力されます。比較内容は1行ずつ、先頭に以下の記号を伴って出力されます。

  • 「=」-- 一致した内容
  • 「<」-- 不一致、<key1> に存在する場合その内容
  • 「>」-- 不一致、<key2> に存在する場合その内容

※ 同名の値がどちらの親キーにも存在する場合は、内容が不一致であれば両方の内容が「不一致」としてそれぞれ出力されます。
Forコマンドを用いればこの内容を解析することもできると考えられますが、スペース文字がキー名か区切り文字かで区別できないため解析に適した出力形式ではないのでご注意ください。

「REG COMPARE」は処理完了時に以下の終了コードを返します。この終了コードをIfコマンドなどで用いることで、バッチファイルの条件分岐を行うことができます。

終了コード意味
0正常終了: 比較結果は一致
1エラー終了(オプション指定ミスや <key1><key2> が見つからない、など)
2正常終了: 比較結果は不一致

※ 正常終了が「0」と「2」でエラー終了が「1」であるため、「If Errorlevel」での比較時は大小関係にご注意ください。

サンプル

reg compare "HKCU\Software\My Company\GoodApp" "HKLM\Backup-Data\My Company\GoodApp" /s

HKEY_CURRENT_USER\Software\My Company\GoodApp」キー内のすべてのサブキーと値を、「HKEY_LOCAL_MACHINE\Backup-Data\My Company\GoodApp」キー内のデータと比較します(「/s」オプションによってサブキーもチェックされます)。このサンプルは、ハイブに保存されたレジストリデータを「HKEY_LOCAL_MACHINE\Backup-Data」としてロードした上で、その内容を既存の内容と比較する、といった用途が考えられます。