以前使ったVERコマンドではDOSからWindows 7まで幅広いバージョンで利用できたわけですが、Windows Vista以降では完全なOS名が出てこなくなりました。バージョン番号で大まかな判別はできましたが、Windows VistaとWindows Server 2008が同じバージョン番号であり区別ができません。また32ビット/64ビットの判別もできません。
SYSTEMINFOコマンドを使えばOS名や32/64ビットの情報を取得できますが、その結果をFORコマンドのdelimsスイッチで取得するのは、今後の互換性を考えるとあまり望ましくありません。

そこで今回はWMICコマンドを使ってWMIを通じて情報を取得してみます。
WMICコマンドはWindows XP以降で使えます。ただしWindows XP Home EditionにはWMICコマンドは搭載されていないので、XPを動作対象に入れる場合は注意が必要です。

SETLOCAL
REM WMICコマンドでシステム情報を取得し変数に代入
FOR /F "tokens=*" %%A IN ('WMIC OS Get ServicePackMajorVersion^,BuildNumber^,Caption /Value ^| FIND "="') DO (
SET OS.%%A
)
FOR /F "tokens=*" %%A IN ('WMIC CPU Get AddressWidth /Value ^| FIND "="') DO (
SET CPU.%%A
)
REM OS名で分岐
ECHO %OS.CAPTION%|FIND "Windows 7">NUL
IF %ERRORLEVEL% EQU 0 (
IF %OS.ServicePackMajorVersion% GEQ 1 (
ECHO お使いのオペレーティングシステムはWindows 7 Service Pack 1以降です。
) ELSE (
ECHO お使いのオペレーティングシステムはWindows 7 RTMです。
) )
ECHO %OS.Caption%|FIND "Windows ServerR 2008">NUL
IF %ERRORLEVEL% EQU 0 (
ECHO お使いのオペレーティングシステムはWindows Server 2008です。
)
ECHO %OS.Caption%|FIND "Windows Vista">NUL
IF %ERRORLEVEL% EQU 0 (
ECHO お使いのオペレーティングシステムはWindows Vistaです。
)
REM ビルド番号で分岐
IF %OS.BuildNumber% GEQ 6000 (
ECHO お使いのオペレーティングシステムのビルド番号は6000以降です。
)
REM Windowsの32ビット/64ビットで分岐
IF %CPU.AddressWidth% EQU 32 (
ECHO お使いのオペレーティングシステムは32ビット版です。
) ELSE (
ECHO お使いのオペレーティングシステムは64ビット版です。
REM コマンドプロンプトの32ビット/64ビットで分岐
IF "%PROCESSOR_ARCHITECTURE%"=="x86" (
ECHO コマンドプロンプトは32ビット^(WOW64^)で動作しています。
) ELSE IF "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
ECHO コマンドプロンプトは64ビットで動作しています。
) )
ENDLOCAL

個々のコマンドについてはいちいち説明しません。分岐はVistaと7しか入れていないので、適宜追加して下さい。
OS名からはエディションの判別もできますが、個人的にはあまりお勧めできません。例えばWindows XP Media Center Editionでは「Windows XP Professional」として返ってきます。
IF文の組み方は見やすいように・理解しやすいように臨機応変に。

最後の「コマンドプロンプトの32ビット/64ビット」について補足しておきます。
64ビット版Windowsのコマンドプロンプト(cmd.exe)には32ビット版(%windir%\syswow64\cmd.exe)と64ビット版(%windir%\System32\cmd.exe)が存在します。通常、単体でコマンドプロンプトを実行すると起動するのは64ビット版の方ですが、WOW64下で動作する32ビットアプリケーションからコマンドプロンプトを呼び出すと32ビット版の方が起動します。

試しにCで下のようなプログラムを作ったとしましょう。

#include "stdlib.h"
main()
{
 	system("pause");
}

標準ライブラリ(msvcrt)のsystem関数を通じてコマンドプロンプトのPAUSEコマンドを実行するだけのプログラムです。
これを32ビット版コンパイラでコンパイル・実行した場合

C>cl a.c
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

a.c
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:a.exe
a.obj

C>a
続行するには何かキーを押してください . . .

C>

これを64ビット版コンパイラでコンパイル・実行した場合

C>cl a.c
Microsoft(R) C/C++ Optimizing Compiler Version 15.00.30729.01 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

a.c
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:a.exe
a.obj

C>a
続行するには何かキーを押してください . . .

C>

アプリケーションの実行中はコマンドプロンプトの画面を見ただけでは32ビット/64ビットの区別はできません。
実行前のタスクマネージャーのプロセス一覧

32ビット版を実行中

64ビット版を実行中

32ビットアプリケーションからは32ビット版、64ビットアプリケーションからは64ビット版のコマンドプロンプトが起動されていることがわかります。

○更新履歴

  • 2012/06/07 WinServer2008追加 
  • 2012/05/29 作成

※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい。コメントはスパム防止フィルターによる承認制のため、投稿してもすぐに反映されない場合があります。

管理人 : Akamaki (akm)

は、PCとVTuberに夢中になっている電気技術者です。

私はレトロコンピューティングの愛好家ですが、そのようなリグはもう収集していません。

私の活動はトップページで見ることができます。読んでくれてありがとう!