Windowsのバージョン毎に処理を分岐 [コマンドプロンプト](旧版)
Windowsのバージョン毎に処理を分けるバッチファイルを作ってみました。
○verコマンド実行結果まとめ
PC DOS Version J6.10/V
(IBM互換機、PC-98)
MS-DOS Version 6.20
(95 OEM Service Release 2)
Windows 95. [Version 4.00.1111]
Windows NT Version 4.0
(98 Second Edition)
Windows 98 [Version 4.10.2222]
Microsoft Windows 2000 [Version 5.00.2195]
Windows Millenium [Version 4.90.3000]
(XP 32ビット版)
Microsoft Windows XP [Version 5.1.2600]
(XP Professional x64 Edition & Server 2003)
Microsoft Windows [Version 5.2.3790]
(Vista Service Pack 1 & Server 2008)
Microsoft Windows [Version 6.0.6001]
(7 & Server 2008 R2)
Microsoft Windows [Version 6.1.7600]
○MS-DOSプロンプト&コマンドプロンプト
参考元(http://malektips.com/xp_dos_0025.html)を参考に少し改良を加えています。
一応MS-DOSでも反応するようになっていますがDOS互換OSやOS/2には対応していません。
Windows Vista以降のverコマンドではOS名がフルで出てこないので、systeminfoコマンドを実行してその結果の中からOS名を抜き出しています。
同じようにsysteminfoコマンドから"システムの種類"を抜き出せば32ビット/64ビットの区別もできるでしょう。
ver|find "DOS">NUL
if not errorlevel 1 goto dos
ver|find "Windows 95">NUL
if not errorlevel 1 goto win95
ver|find "Windows 98">NUL
if not errorlevel 1 goto win98
ver|find "Windows Millennium">NUL
if not errorlevel 1 goto winme
ver|find "NT">NUL
if not errorlevel 1 goto winnt
ver|find "2000">NUL
if not errorlevel 1 goto win2k
ver|find "XP">NUL
if not errorlevel 1 goto winxp
ver|find "2003">NUL
if not errorlevel 1 goto win2k3
if not exist %SystemRoot%\system32\systeminfo.exe goto warn
setlocal enableextensions
for /f "tokens=2 delims=," %%a in ('%SystemRoot%\system32\systeminfo.exe /FO CSV /NH') do set osvers=%%a
echo %osvers%|find "Windows Vista">NUL
if not errorlevel 1 goto winvista
echo %osvers%|find "Windows ServerR 2008">NUL
if not errorlevel 1 goto win2k8
echo %osvers%|find "Windows 7">NUL
if not errorlevel 1 goto win7
goto warn
:dos
echo DOS
goto eof
:win95
echo Windows 95
goto eof
:win98
echo Windows 98
goto eof
:winme
echo Windows Me
goto eof
:winnt
echo Windows NT
goto eof
:win2k
echo Windows 2000
goto eof
:winxp
echo Windows XP
goto eof
:win2k3
echo Windows 2003
goto eof
:winvista
echo Windows Vista
goto eof
:win2k8
echo Windows 2008
goto eof
:win7
echo Windows 7
goto eof
:warn
echo Unknown Windows version
:eof
verコマンドを実行してその出力結果をパイプでfindコマンドに入力。
findコマンドの終了コードが0 つまり指定した文字列が見つかればそのOSの処理に飛びます。
for~ではCSV形式で出力したsysteminfo.exeの実行結果を解析し、指定した部分を変数osversに代入しています。
Windows Vista以降で動くことを前提にするならもっと単純で分かり易いスクリプトが作れたかと思います。
○PowerShell
PowerShellは使い慣れていないのでこのサンプルは参考程度に。
ここではバージョン取得に.net FrameworkのSystem.Environmentクラス、32ビットか64ビットかを見分けるためにWMIを利用しています。
$osver_major = [Environment]::osversion.Version.Major $osver_minor = [Environment]::osversion.Version.Minor $systype = (Get-WmiObject -Class Win32_ComputerSystem -ComputerName .).systemtype if ($osver_major -lt 7) { switch ($osver_major){ "5"{ switch ($osver_minor){ "1" {write-host "Windows XP (i386)"} "2" {write-host "Windows XP Professional x64 Edition"} default {write-host "?"} } } "6"{ switch ($osver_minor){ "1" {write-host "Windows 7" -nonewline} "0" {write-host "Windows Vista" -nonewline} default {write-host "?"} } switch ($systype) { "X86-based PC" {write-host " (32-bit)"} "X64-based PC" {write-host " (64-bit)"} default {write-host "(?)"} } } default {write-host "?"} } } else { write-host "?" }
64ビット版Windowsが手元にないのでちゃんと振り分けられるかどうか不明。
Windows Serverとの区別をしていないので若干問題あり。
.net Framework 4ではIs64BitOperatingSystemプロパティが追加されていますが、互換性を考えて使いませんでした。
また、WMIだけでもバージョン取得から32/64ビットの区別まで済ませることができますが、ここではあえて両方使いました。
この他にもWindowsのバージョンを取得・分岐する方法はまだまだたくさんあるでしょう。
10/12/05 いろいろ修正
10/10/25 作成