レジストリプロバイダーでレジストリキー情報を取得

前回は、プロバイダーを移動する方法や、キーの表示方法を紹介しました。前回に引き続き、レジストリを操作する基本的なコマンドレットを紹介します。

今回は、プログラミングをするわけではないので、通常のPowerShellコマンドラインを使用します。

まず、主キー、HKEY_CURRENT_USER以下の、\Software\Microsoftキーから見てみます。Set-Location(省略形sl)で、カレントディレクトリ(フォルダあるいはロケーション)を移動します。次に、Get-ChildItem(省略形gci)を実行してサブキーを確認します。

sl  HKCU:\Software\Microsoft
gci

Set-Locationでレジストリプロバイダに移動し、Get-ChildItemでサブキーを一覧表示します。

※ Set-Locationの詳細は前回を参照してください。

※ レジストリプロバイダでパスを入力するときも、ファイルシステムでパスを入力するときと同様に、途中まで入力した後にTabキーを押して入力補完できます。たとえば、Microsoftというキー名をすべて入力しなくても、最初の数文字...miなど...を入力してTabキーをおせば、自動的にMicrosoftと補完します。

ここで、念のため、レジストリエディタ(regeditコマンド)でHKCU:\Software\Microsoftのサブキーを確認してみましょう。

レジストリエディタで確認。PowerShellで一覧表示したのと同じ内容のはずです。

なお、レジストリキーの情報を得るにはGet-Item(省略形gi)とGet-ChildItemの2つのコマンドレットを使うのが一般的ですが、Get-Itemは指定したレジストリキーの情報を、Get-ChildItemは指定したレジストリキーのサブキーの情報を取得します。

試しに、レジストリエディタで、カレントキー(HKCU:\Software\Microsoft)のサブキーであるDirect3Dを確認してみます。Drect3Dのサブキーとして、MostRecentApplicationキーがあることがわかります。

レジストリエディタで、Direct3Dキーとそのサブキーを確認します。

カレントキーのサブキー、Direct3Dの情報を取得するには次のように実行します。

gi  Direct3D

次に、Direct3Dのサブキーの情報を表示するには、Get-ChildItemを実行します。

gci  Direct3D

Get-Itemでは指定したキー自身、Get-ChildItemではそのサブキーの情報を表示します。

エントリ情報を取得

一方、レジストリキーそのものではなく、レジストリキーに保存されたエントリを取得するためには、Get-ItemProperty(省略形gp)を使用します。

たとえば、HKCU:\Software\Microsoft\Direct3D\MostRecentApplicationキーには、Nameという文字列型エントリがあり「DllHost.exe」という文字列が保存されています。

レジストリエディタで、MostRecentApplicationキーのNameエントリを確認。

PowerShelldでは、Get-ItemPropertyで取得します。そのまま情報を表示するだけでなく、変数に代入して、プロパティでエントリのデータを取り出すこともできます。

sl  Direct3D
gp  Direct3D\MostRecentApplication

Direct3Dのキーに移動して、Get-ItemPropertyでMostRecentApplicationのエントリ情報を取得。

$p = gp  Direct3D\MostRecentApplication
$p.PSChildName
$p.Name

Get-ItemPropertyで取得したオブジェクトを変数pに入れ、pのプロパティとして、キーのプロパティやエントリを取得。

なお、レジストリエディタで「(既定)」と表示されているエントリにについては、プロパティ名が「(default)」となります。プロパティ名に()が含まれているため、PowerShellで指定するときには" "または' 'でくくる必要があります。

レジストリエディタで見ると、全てのキーに「(既定)」というエントリがあります。多くは値の設定がありません。

エントリ「(既定)」にアクセスするには、プロパティとして"(default)"を指定します。この例では、もともと値の設定がないので、何も表示されません。

※ 英語版Windowsでは、レジストリキーの既定のエントリは「(既定)」ではなく「(default)」と表示されます。つまり、もともとのエントリ名は「(default)」であり、日本語版ではそれを「(既定)」と表示しているだけだと思われます。

キーの存在を確認する

特定のレジストリキーが存在するかどうかを確認するには、ファイルシステムでファイルやフォルダの存在を確認するときと同じ、Test-Pathコマンドレットを使用します。指定したパスが存在すればTrue(真)、存在しなければFalse(偽)を返します。

Test-Path MostRecentApplication
Test-Path  Most

をそれぞれ実行してみます。

Test-Pathを実行すると、パスの存在を確認してTrueまたはFalseを返します。

キーやエントリを作成する

PowerShellでは、ファイルシステムを操作してファイルやフォルダを作成するとき、New-Item(省略形ni)を使用します。同様に、レジストリを操作するときも、New-Itemで新しいキーを作成できます。

たとえば、HKCU:のルートに新しいレジストリキー、Testを作成するには、以下のように実行します。

sl  HKCU:\
ni  Test

新しいキー、Testを作成。

キーに対してエントリを作成するときは、New-ItemPropertyを作成します。New-ItemPropertyの一般的な仕様スタイルは次の通りです。

New-ItemProperty  エントリを作成するキーのパス エントリ名 -PropertyType エントリの型 -Value エントリの値

たとえば、レジストリキーTestに、文字列型のエントリ「PCName」を作成し、データとして「Prime64」を保存するには、以下のように実行します。

New-ItemProperty  Test  PCName  -PropertyType  String  -Value  "Prime64"

レジストリキーTestに、エントリPCNameを作成して値を保存。

レジストリキーTest、そのエントリPCNameが作成されているかどうか、レジストリエディタで確認。すでにレジストリエディタを開いているときは、F5キーを押して再表示してください。

パスの指定は、カレントパス直下であればキー名だけを記述してかまいません。カレントパス以外のパスであれば、HKCU:\Test のようにパスを指定します。

-PropertyTypeに指定するエントリの型は次の通りです。

指定するキーワード レジストリエディタでの表示 説明
Binary REG_BINARY バイナリデータ(文字列以外のデータ)
DWord REG_DWORD 4バイト長の整数データ
ExpandString REG_EXPAND_SZ 環境変数(%TEMP%など)を含む文字列
MultiString REG_MULTI_SZ 複数の文字列
QWord REG_QWORD 8バイト長の整数データ
String REG_SZ 文字列

レジストリキーの大文字と小文字

PowerShellは基本的に大文字と小文字を区別しません。New-Itemコマンドレットでレジストリキーを作成すると、コマンドラインで大文字を使っても、作成するレジストリキー名はすべて小文字になります。

意図して大文字小文字を使い分けたレジストリキーを作成したいときは、作成するキー名を" "でくくってください。New-Item "Test" のように実行します。

キーやプロパティを削除する

キーやプロパティを削除するときには、Remove-Item(省略形ri)あるいはRemove-ItemPropertyを使用します。

たとえば、レジストリキー Test を削除するには、次のように実行します。

ri  Test

以上で、主要なレジストリ操作のコマンドレットを紹介しました。

これらを組み合わせて、次回から、簡単なスクリプトプログラムを作成します。特定のレジストリキーが存在するかどうかを検査し、そのレジストリキーが存在しなければ、新規にレジストリキーとエントリを作成するプログラムです。