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の呼び名は以下が参考になります。
参考サイト
- http://ebi.dyndns.biz/windowsadmin/2013/02/06/%E3%83%90%E3%83%83%E3%83%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A7windows-os%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E5%88%A4%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/
- http://lsair.html.xdomain.jp/a/e/g13_123_windows_1.html
- http://lsair.html.xdomain.jp/a/e/g13_203_windows3264.html