3流プログラマのメモ書き

元開発職→現社内SEの三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(バッチ)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

ECHO Windows NT

GOTO :EOF

 

:WIN2K

ECHO Windows 2000

GOTO :EOF

 

:WINXP

ECHO Windows XP

GOTO SP_CHK

 

:WIN2K3

ECHO Windows 2003

GOTO SP_CHK

 

:WINVISTA

ECHO Windows Vista

GOTO SP_CHK

 

:WIN2K8

ECHO Windows 2008

GOTO SP_CHK

 

:WIN7

ECHO Windows 7

GOTO SP_CHK

 

:WARN

ECHO Unknown Windows version

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%

 

 

pause

サービスパックに関しては、レジストリから取得しています。

これ以外にも、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

IF %ERRORLEVEL% EQU 0 set SP_NAME=SP3

また、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を使ったほうが良いかもしれません)

参考:

Windows XPでSPのバージョンを確認するバッチファイルを作成し - Windows XP - 教えて!goo

バッチファイル(~.BAT)の中でXPsp2とsp3を判定する方法を教えてください。 - Yahoo!知恵袋