ここでは、Windows2000/XP のコマンドプロンプト、Windows95/98/98SE/Me のDOSプロンプト上のバッチでOSを判定する方法について紹介します。
当ページのリンクでも紹介している、@nifty FPCU本館が運営のDOSプロンプト活用相談室で過去私が回答したOS判定方法がこれである→発言スレッド過去ログへリンク (ご注意:この過去ログは、表示するごとに@nifty 有料会員ログインチェックが行われます。ログインをキャンセルしても閲覧できますが、会員のかたはIDとパスワードを入力してログインしていただけば、以後ブラウザを終了するまで再ログインなしで閲覧できます。)
if "%userprofile%"=="" goto LWin9X for /f "tokens=1-3" %%i in ('ver') do set os=%%k if "%os%"=="Version" goto LWinNT if "%os%"=="2000" goto LWin2k if "%os%"=="XP" goto LWinXP
このときは Win9X系とNT系の区別は %userprofile% の有無で行っていました。 今考えると、"%OS%"="Windows_NT"のほうが良かったかな。また相談者は95/98/Meの区別が必要なかったため Win9X系としてまとめて判定しています。
巷とはどこかと言うと、@IT、Microsoftなどが挙げられます。
@IT〜OSの種類によってバッチ・ファイルの処理を切り替える方法
この方法は環境変数 comspec による判断です。ざっくり 9X系 か NT系かを判断するにはシンプルでいいかも。
@echo off if "%comspec%"=="" echo OSの種類が分かりません if "%comspec%"=="c:¥command.com" echo MS-DOS、ないしWindows 9x系です if "%comspec%"=="%systemroot%¥system32¥cmd.exe" echo Windows NT/2000/XP系です
マイクロソフト サポート技術情報 - 318689
verコマンドの結果を find で検索して errorlevel で分岐しています。
次のサンプル スクリプトでは、Windows のバージョンを検出するため、ver と find が使用されます。 この方法では、VER のすべての結果に対してセクションが必要ですが、より確実な方法です。 @ECHO off SETLOCAL VER | find "NT" > nul IF not errorlevel 1 GOTO Win_NT VER | find "2000" > nul IF not errorlevel 1 GOTO Win_NT VER | find "XP" > nul IF not errorlevel 1 GOTO Win_NT VER | find "98" > nul IF not errorlevel 1 GOTO Win_9X VER | find "95" > nul IF not errorlevel 1 GOTO Win_9X GOTO unknown_os :win_NT call kix32.exe myscript.scr goto end :win_9X %0¥..¥kix.exe %0¥..¥kix32.exe myscript.scr goto end :unknown_os :end
この方法は、バージョンを表示する ver コマンドの出力結果を見比べたときに思いついた方法。
参考にしたページは、Microsoftの Blaster に関する情報の "Step 1: 影響を受ける Windows か確認する" の内容。
なんといってもif 文を使わずに判定できる点が気に入っている理由。ただし、Windows2003を犠牲にしています。2003を判定するにはif 文を使わないといけない。
ここでは、95 / 98 / Millennium / NT / 2000 / XP を対象とすることにする。(いい訳 ^^)
echo off REM %OS%の値 --- 95 / 98 / Millennium / NT / 2000 / XP echo set OS=%%1> Windows.bat echo set OS=%%2> Microsoft.bat ver > tmp.bat call tmp.bat del Windows.bat del Microsoft.bat del tmp.bat echo %OS%