treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

Windowsバージョン情報をレジストリから取得してみる

すぐに使う予定ではないのですが、Windows11(場合によってはWindows10も含め)のバージョン情報を取得してバッチの分岐条件に使う可能性が出てきたので、どうやって取得すればいいか検証した結果をご報告します。

Windowsのバージョン情報

Windowsのバージョン情報は2024年8月8日現在ではコマンド「winver」を実行すると表示されるウインドウで確認するのが一般的です。

※winver実行結果

欲しいのは、上記画面の「23H2」のような大型アップデートの更新番号です。Windows10以前には22H2(現在の最新)とか、21H2といったバージョン情報があります。今後24H2、25H2のように増えていくと思われます。

しかし、「winver」コマンドだとスクリプト・バッチファイルとかで使える情報にはならないため、他に収集する方法がないかと考え、レジストリからそのバージョン番号を示す情報が取得できないかを探してみました。

レジストリを検索

23H2適用済のWindows11でレジストリ内を検索して探してみます。

探してみたところ、二つの記録箇所を見つけました。

一つは、<HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion>キー配下の「DisplayVersion」値、

ここに値のデータとして「23H2」が記録されていました。

もう一つは、<HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion>キー配下の「DisplayVersion」値、

ここにも同様に値のデータには「23H2」が記録されていました。

取得自体はどちらでも良さそうなのですが、レジストリのサブキーである「WOW6432Node」配下のキーは64ビット環境で32ビットアプリケーションを動作させるために使われるキーなので、実際に条件として使うには<HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion>のほうが適切と判断しました。

過去のWindows10の場合

ちなみに、ちょっと脱線しますが、Windows10の場合にはバージョンによって確認箇所が異なってくるケースがあります。

現状の最新Windows10は22H2で、これは前述のWindows11で確認したときと同じ<HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion>キーの「DisplayVersion」値で確認できました。

しかし、旧バージョンであるLTSB(LTSC)ではレジストリキーの「DisplayVersion」値が存在しません。旧Windows10では同キー配下の「ReleaseId」値を使う必要があるようです。

「ReleaseId」値には値のデータとしてバージョン1607とか1507といったWindows10の旧バージョン番号の数値が保存されています。

今回は対象外ではあるのですが、もし旧Windows10(LTSBやLTSCの1507や1607)を対象とする場合には、IF文を使い「DisplayVersion」値の有無で分岐させ、さらに「ReleaseId」値の存在確認をすることで対象のWindowsバージョンを判定させる必要があるように見えます。

コマンドラインで表示してみる

さっそく、コマンドプロンプトを使用して前述の発見したレジストリキーを画面表示してみます。

単純に、

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion"

でレジストリキーが列挙されるので、抽出してみます。抽出はfindstrです。

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" | findstr DisplayVersion

これを実行すると、

このように「DisplayVersion    REG_SZ    23H2」と画面に表示されます。

「reg query」コマンドのオプションで値と値のデータの画面表示を絞ることもできます。

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v DisplayVersion

と、「/v キー内の値名称」オプションを付けてコマンドを実行すると、

このように<HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion>の表示に続いて、「DisplayVersion    REG_SZ    23H2」が表示されます。

サンプルバッチ

レジストリキーから「23H2」だけ取り出すバッチです。

--------------------------------------------------------------
Winver-test.bat
--------------------------------------------------------------
@echo off
set WinDispVer=

for /F "tokens=3" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v "DisplayVersion"') do set WinDispVer=%%i

echo %WinDispVer%

set WinDispVer=
--------------------------------------------------------------

バッチでは、変数「%WinDispVer%」にDisplayVersion値のデータである23H2が代入されます。それを単純にechoで画面表示しています。

実行すると

このように、画面にはecho文にある変数%WinDispVer%に代入された「23H2」だけが表示されます。

もしバッチで判定条件に使うとしたら、変数%WinDispVer%をIF文で比較していけばいいので、バージョン情報をバッチ内で使う準備はできたような気がします。