WindowsのOSのバージョンやビットでIF文による分岐処理をするバッチファイル

OSのバージョンやビット数に応じて実行させたい処理を切り替えて実行するバッチファイルのメモ。JAVA(JRE)やWindows Updateの更新ファイルをインストールする際に使えそうです。OSのバージョンごとにバッチファイルを用意している場合はこれでまとめることができます。

OSの32/64ビットで分岐するバッチファイル

単純に32ビットか64ビットかだけを判別するとしたら%PROCESSOR_ARCHITECTURE%で判別できます。

@echo off
if "%PROCESSOR_ARCHITECTURE%" EQU "x86" (
echo "32bit"
)
if "%PROCESSOR_ARCHITECTURE%" NEQ "x86" (
echo "64bit"
)
または
@echo off
if "%PROCESSOR_ARCHITECTURE%" == "x86" (
echo "32bit"
)else(
echo "64bit"
)

OSのバージョンと32/64ビットで分岐するバッチファイル

WMICコマンドOSでOSのバージョンを取得し、WMICコマンドCPUで64ビットか32ビットかを取得し、処理を分岐させます。以下の画面はWMICコマンドでOS情報とCPU情報を表示させてものです。ここで表示される値をバッチファイルで判別して分岐処理に使用します。

@echo off

rem WMICコマンドで取得したシステム情報を変数に代入
FOR /F "tokens=*" %%A IN ('WMIC OS Get ServicePackMajorVersion^,BuildNumber^,Caption /Value ^| find "="') DO (SET OS.%%A)

rem WMICコマンドで取得したCPU情報を変数に代入
FOR /F "tokens=*" %%A IN ('WMIC CPU Get AddressWidth /Value ^| find "="') DO (SET CPU.%%A)

rem OS名で分岐
echo %OS.Caption%|find "Windows 10">NUL
if %ERRORLEVEL% equ 0 (
	rem Windowsの32ビット/64ビットで分岐
	if %CPU.AddressWidth% equ 64 (
		goto win10x64
	) else (
		goto win10x86
	)
)

echo %OS.Caption%|find "Windows 8.1">NUL
if %ERRORLEVEL% equ 0 (
	if %CPU.AddressWidth% equ 64 (
		goto win81x64
	) else (
		goto win81x86
	)
)

echo %OS.Caption%|find "Windows 8.0">NUL
if %ERRORLEVEL% equ 0 (
	if %CPU.AddressWidth% equ 64 (
		goto win8x64
	) else (
		goto win8x86
	)
)

echo %OS.Caption%|find "Windows 7">NUL
if %ERRORLEVEL% equ 0 (
	rem SP1であるかで分岐
	if %OS.ServicePackMajorVersion% GEQ 1 (		
		if %CPU.AddressWidth% equ 64 (
			goto win7sp1x64
		) else (
			goto win7sp1x86
		)
	) else (
		if %CPU.AddressWidth% equ 64 (
			goto win7x64
		) else (
			goto win7x86
		)
	)
)

echo %OS.Caption%|find "Windows Vista">NUL
if %ERRORLEVEL% equ 0 (
	if %CPU.AddressWidth% equ 64 (
		goto winvistax64
	) else (
		goto winvistax86
	)
)

echo %OS.Caption%|find "Windows Server 2008">NUL
if %ERRORLEVEL% equ 0 (
	if %CPU.AddressWidth% equ 64 (
		goto win2008x64
	) else (
		goto win2008x86
	)
)

echo %OS.Caption%|find "Windows Server 2012">NUL
if %ERRORLEVEL% equ 0 (
	goto win2012x64
)

echo %OS.Caption%|find "Windows Server 2016">NUL
if %ERRORLEVEL% equ 0 (
	goto win2016x64
)

:win10x64
echo Windows 10 64bit
pause
goto :eof

:win10x86
echo Windows 10 32bit
pause
goto :eof

:win81x64
echo Windows 8.1 64bit
pause
goto :eof

:win81x86
echo Windows 8.1 32bit
pause
goto :eof

:win8x64
echo Windows 8 64bit
pause
goto :eof

:win8x86
echo Windows 8 32bit
pause
goto :eof

:win7sp1x64
echo Windows 7 SP1 64bit
pause
goto :eof

:win7sp1x86
echo Windows 7 SP1 32bit
pause
goto :eof

:win7x64
echo Windows 8.1 64bit
pause
goto :eof

:win7x86
echo Windows 8.1 32bit
pause
goto :eof

:winvistax64
echo Windows Vista 64bit
pause
goto :eof

:winvistax86
echo Windows Vista 32bit
pause
goto :eof

:win2016x64
echo Windows Server 2016 64bit
pause
goto :eof

:win2012x64
echo Windows Server 2012 64bit
pause
goto :eof

:win2008x64
echo Windows Server 2008 64bit
pause
goto :eof

:win2008x86
echo Windows Server 2008 32bit
pause
goto :eof

OSのバージョンので分岐するバッチファイル

VERコマンドではビット数は取得できないので、OSのバージョンだけで分岐させるのであれば以下のVERコマンドを使用したソースでも分岐処理が行えます。

@echo off

ver|find "NT">nul
if %errorlevel% equ 0 goto winnt

ver|find "2000">nul
if %errorlevel% equ 0 goto win2000

ver|find "XP">nul
if %errorlevel% equ 0 goto winxp

if not exist %SystemRoot%\System32\systeminfo.exe goto warn
for /F "tokens=2 delims=," %%a in ('%SystemRoot%\System32\systeminfo.exe /FO CSV /NH') do set osvers=%%~a

echo %osvers%|find "Windows ServerR 2003">nul
if %errorlevel% equ 0 goto win2003

echo %osvers%|find "Windows Vista">nul
if %errorlevel% equ 0 goto winvista

echo %osvers%|find "Windows 7">nul
if %errorlevel% equ 0 goto win7

echo %osvers%|find "Windows 8.0">nul
if %errorlevel% equ 0 goto win8

echo %osvers%|find "Windows 8.1">nul
if %errorlevel% equ 0 goto win8.1

echo %osvers%|find "Windows 10">nul
if %errorlevel% equ 0 goto win10

echo %osvers%|find "Windows Server 2008">nul
if %errorlevel% equ 0 goto win2008

echo %osvers%|find "Windows Server 2012">nul
if %errorlevel% equ 0 goto win2012

echo %osvers%|find "Windows Server 2016">nul
if %errorlevel% equ 0 goto win2016

goto warning

:winnt
echo Windows NT
pause
goto :eof

:win2000
echo Windows 2000
pause
goto :eof

:winxp
echo Windows XP
pause
goto :eof

:win2003
echo Windows Server 2003
pause
goto :eof

:winvista
echo Windows Vista
pause
goto :eof

:win7
echo Windows 7
pause
goto :eof

:win8
echo Windows 8
pause
goto :eof

:win8.1
echo Windows 8.1
pause
goto :eof

:win10
echo Windows 10
pause
goto :eof

:win2008
echo Windows Server 2008
pause
goto :eof

:win2012
echo Windows Server 2012
pause
goto :eof

:win2016
echo Windows Server 2016
pause
goto :eof

:warning
echo Unknown Windows version
pause

ビルド番号で分岐する場合

Windows10はビルド番号によってAnniversary UpdateとかCreators Updateとか呼び名がありますが、これで分岐させる場合は以下となります。ビルド15063以上をCreators Updateと判別した例です。今後、呼び名の違う次の上位ビルドが現れたときは改造でしてください。

@echo off

rem WMICコマンドで取得したシステム情報を変数に代入
FOR /F "tokens=*" %%A IN ('WMIC OS Get ServicePackMajorVersion^,BuildNumber^,Caption /Value ^| find "="') DO (SET OS.%%A)

rem OSのビルド番号で分岐
if %OS.BuildNumber% geq 15063 (
	goto win10rs2
) else (
	goto win10
)

:win10rs2
echo Windows 10 Creators Updatedです。
pause
goto :eof

:win10
echo Windows 10 Creators Updatedではありません。
pause
goto :eof

ビルド番号やバージョンによるWindows 10の呼び名は以下が参考になります。

参考サイト