今回はレジストリについて、取得方法を紹介します。
Regコマンドを使用した方法
まずは、Regコマンドでやってみます。今回はWindows10のリリースビルド番号を例にやってみます。
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 /f では()内の「’」でくくられたコマンドの返り値を読み込み、デフォルトで半角スペースを区切り文字として%A,%B,%C・・・という変数に読み込みます。
今回はTokensオプションを指定して、Reg Queryコマンドの戻り値から、3番目に読み込んだ値を%Aに格納しています。
その後REG_RESULT変数に引き出してechoしています。その部分がレジストリの値そのものになります。
この問題を解決するためには、値が直接出力されるコマンドを使用しなくてはなりません。先程の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
PowerShellではコマンドの実行時、値がそのまま出力されるので、Tokensは「*」(すべて)を指定します。
また、Forでの「’」指定とPowerShellでの「’」指定にて重複が発生するため、For文側の「’」を「`」に置き換えるusebackqオプションを付けています。
今回のPowerShellコマンドは空白が多いため、一つのコマンドとしてみなすために「"」でくくります。
この方法であれば確実にレジストリの値を取得することができます。
まとめ
レジストリの取得はよく使う場面が多いですが、意外にバッチにしようと思うと苦戦することが多くあります。
個人的にはForとPowerShellを組み合わせた形で取得することがおおいです。やはり環境やキー名に左右されたくないですからね。
何かのお役に立てれば幸いです。
コメント