(バッチ)OSのバージョンとサービスパックの有無を調べる
バッチファイルで、Windowsのバージョンと、サービスパックの情報を取得する方法です。
幾つか方法はあるかと思いますが、Windowsのバージョンの取得判定はWindowsのバージョン毎に処理を分岐させる [コマンドプロンプト] - Diary on windを参考にさせてもらいました。
WindowServer2003以降は ver コマンドではWindowsということしかわからない様で、systeminfo コマンドを使って調べてるようです。
(しかし、systeminfoコマンドはちょいと重いのであまり使いたくはないんですよね。。)
@echo off
rem Windowsのバージョンチェック
SETLOCAL ENABLEEXTENSIONS
VER|FIND "NT">NUL
IF %ERRORLEVEL% EQU 0 GOTO WINNT
VER|FIND "2000">NUL
IF %ERRORLEVEL% EQU 0 GOTO WIN2K
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 "Server 2003">NUL
IF %ERRORLEVEL% EQU 0 GOTO WIN2K3
ECHO %osvers%|FIND "Windows Vista">NUL
IF %ERRORLEVEL% EQU 0 GOTO WINVISTA
ECHO %osvers%|FIND "Server 2008">NUL
IF %ERRORLEVEL% EQU 0 GOTO WIN2K8
ECHO %osvers%|FIND "Windows 7">NUL
IF %ERRORLEVEL% EQU 0 GOTO WIN7
GOTO WARN
rem 各OS別の処理
:WINNT
GOTO :EOF
:WIN2K
GOTO :EOF
GOTO SP_CHK
:WIN2K3
GOTO SP_CHK
:WINVISTA
GOTO SP_CHK
:WIN2K8
GOTO SP_CHK
:WIN7
GOTO SP_CHK
:WARN
GOTO SP_CHK
rem サービスパックのチェック
:SP_CHK
FOR /F "TOKENS=1,2,*" %%A IN ('REG QUERY "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v "CSDVersion"') DO IF "%%A"=="CSDVersion" SET SPVER=%%C
echo %SPVER%
サービスパックに関しては、レジストリから取得しています。
これ以外にも、wmic os get csdversion を使う方法があります。
以下のような感じです。
set SP_NAME=
set SP=
for /F "delims=" %%v in ('wmic os get csdversion') do set SP=%%v
ECHO %SP%|FIND "Service Pack 1">NUL
IF %ERRORLEVEL% EQU 0 set SP_NAME=SP1
ECHO %SP%|FIND "Service Pack 2">NUL
IF %ERRORLEVEL% EQU 0 set SP_NAME=SP2
ECHO %SP%|FIND "Service Pack 3">NUL
また、systeminfoからサービスパック情報も取得できますね。
IF NOT EXIST %SystemRoot%\System32\systeminfo.exe GOTO WARN
FOR /F "tokens=3 delims=," %%A IN ('%SystemRoot%\System32\systeminfo.exe /FO CSV /NH') DO SET osvers=%%A
echo %osvers%
ECHO %osvers%|FIND "Service Pack 1">NUL
IF %ERRORLEVEL% EQU 0 set SP_NAME=SP1
ECHO %osvers%|FIND "Service Pack 2">NUL
IF %ERRORLEVEL% EQU 0 set SP_NAME=SP2
ECHO %osvers%|FIND "Service Pack 3">NUL
IF %ERRORLEVEL% EQU 0 set SP_NAME=SP3
echo %SP_NAME%
しかし、wmic も reg query でレジストリから取得する方法も、systeminfo も XP以上出ないと使えません。
Windows2000でもサービスパックのバージョンを調べようとすると、他の手立てを取る必要があります。
(バッチじゃなくVBScriptを使ったほうが良いかもしれません)
参考: