スポンサーリンク

【Bat】バッチファイル内でレジストリの値を取得する方法

Bat
スポンサーリンク

今回はレジストリについて、取得方法を紹介します。

Regコマンドを使用した方法

まずは、Regコマンドでやってみます。今回はWindows10のリリースビルド番号を例にやってみます。

Windows10のリリースビルド番号は下記に格納されています。

キー:HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion
サブキー:ReleaseID

reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ReleaseID

Reg Queryコマンドの基本的な使い方そのものです。
今回はレジストリキー名に半角スペースを含むので、「"」でくくっています。

本サイト内では「”」をコピーした際に全角になることがあります。その際は貼り付けた後に半角の「”」で置換してください。

この方法での問題点はReg Queryの出力が2行にわたり、かつ、余計な情報まで表示される点です。

これを解決するために次の方法でやってみます。

PowerShellを使用した方法

今度はPowerShellでやってみます。

powershell (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').ReleaseID

PowerShellではGet-ItemPropertyコマンドにてレジストリを取得することができます。PowerShellでは「”」ではなく「’」を使用します。

キーに含まれるサブキーの値を一括で取得し、その中から値が欲しいサブキーを.[サブキー名]の形で指定してあげればすんなり値だけを取得することができます。

これら2つの方法では、バッチ内で値を受け渡すのが非常に面倒です。
(setコマンドなどで変数に格納できない)

下記に示すやり方でも同様の効果が得られ、変数に格納するのでバッチ内での取り扱いが非常に楽です。

Regコマンドの結果をForコマンドで取得する方法

こちらはよく使われるタイプの方法です。
Regコマンドの戻り値をFor文で必要なところのみ取り出し、格納します。

for /f "tokens=3" %%A in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v "ReleaseID"') do set REG_RESULT=%%A

echo %REG_RESULT%

For文内の「%%」は直接コマンドラインで実行する際に「%」を1つ削除しないと正常に実行できません。
例)%%A→%A

For /f では()内の「’」でくくられたコマンドの返り値を読み込み、デフォルトで半角スペースを区切り文字として%A,%B,%C・・・という変数に読み込みます。

今回はTokensオプションを指定して、Reg Queryコマンドの戻り値から、3番目に読み込んだ値を%Aに格納しています。

その後REG_RESULT変数に引き出してechoしています。その部分がレジストリの値そのものになります。

レジストリキー名に空白があったりすると、その個数分Tokensでの数字は増やさなくてはなりません。

この問題を解決するためには、値が直接出力されるコマンドを使用しなくてはなりません。先程のPowerShellのコマンドでなら、それを解決できるでしょう。早速、読み込んでみましょう。

PowerShellの結果をForコマンドで取得する

Regコマンドの時と同様にPowerShellの場合もやってみます。

for /f "tokens=* usebackq" %%A in (`"@powershell (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion').ReleaseID"`) do set REG_RESULT=%%A

For文内の「%%」は直接コマンドラインで実行する際に「%」を1つ削除しないと正常に実行できません。
例)%%A→%A

PowerShellではコマンドの実行時、値がそのまま出力されるので、Tokensは「*」(すべて)を指定します。

また、Forでの「’」指定とPowerShellでの「’」指定にて重複が発生するため、For文側の「’」を「`」に置き換えるusebackqオプションを付けています。

今回のPowerShellコマンドは空白が多いため、一つのコマンドとしてみなすために「"」でくくります。

この方法であれば確実にレジストリの値を取得することができます。

まとめ

レジストリの取得はよく使う場面が多いですが、意外にバッチにしようと思うと苦戦することが多くあります。

個人的にはForとPowerShellを組み合わせた形で取得することがおおいです。やはり環境やキー名に左右されたくないですからね。

何かのお役に立てれば幸いです。

コメント

タイトルとURLをコピーしました