追記:この記事に記載されているSYSTEMINFOコマンドを使った方法は非推奨です。Windows XP以前はVERコマンド、Windows Vista以降についてはWMICコマンドを使った方法を推奨します。

Windowsのバージョン毎に処理を分けるバッチファイルを作ってみました。

○VERコマンド実行結果まとめ

Windows NT Version 4.0

Microsoft Windows 2000 [Version 5.00.2195]

(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]

(8 & Server 2012)
Microsoft Windows [Version 6.2.9200]

○バージョン別VERコマンド実行イメージ
IBM DOS J5.0/V
MS-DOS 6.2/V
Windows 98 Second Edition
Windows 2000 Service Pack 4
Windows XP 32-bit
Windows Vista Service Pack 2
Windows 7 Service Pack 1

○コマンドプロンプト

参考元(http://malektips.com/xp_dos_0025.html)を参考に少し改良を加えています。
Windows Vista以降のVERコマンドではOS名がフルで出てこないので、SYSTEMINFOコマンドを実行してその結果の中からOS名を抜き出しています。
コマンド拡張機能を利用しているためDOS(MS-DOS,PC DOS)やMS-DOSプロンプト(Win9X,Me)では動きません。
DOS対応版は旧版を参照してください。32ビット/64ビット判別やService Packの判別はこちらを参照して下さい。

rem check windows version---------------
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 "Windows ServerR 2003">NUL
if %errorlevel% EQU 0 goto win2k3
echo %osvers%|find "Windows Vista">NUL
if %errorlevel% EQU 0 goto winvista
echo %osvers%|find "Windows ServerR 2008">NUL
if %errorlevel% EQU 0 goto win2k8
echo %osvers%|find "Windows 7">NUL
if %errorlevel% EQU 0 goto win7
echo %osvers%|find "Windows Server 2012">NUL
if %errorlevel% EQU 0 goto win2012
goto warn

:winnt
echo Windows NT
goto :EOF
:win2k
echo Windows 2000
goto :eof
:winxp
echo Windows XP
goto :eof
:win2k3
echo Windows Server 2003
goto :eof
:winvista
echo Windows Vista
goto :eof
:win2k8
echo Windows Server 2008
goto :eof
:win7
echo Windows 7
goto :eof
:win2012
echo Windows Server 2012
goto :eof
:warn
echo Unknown Windows version

VERコマンドを実行してその出力をパイプでFINDコマンドに入力。
FINDコマンドの終了コードが0、つまり指定した文字列が見つかればそのOSの処理に飛びます。
FORコマンドではCSV形式で出力したSYSTEMINFOコマンドの実行結果を解析し、指定した部分を変数osversに代入しています。
その後ECHOコマンドで変数osversの値を出力し、それをパイプでFINDコマンドに...としています。
条件分岐後はECHOコマンドでOS名を表示していますが、実際はここに処理するコマンドを記述していくことになります。


以下補足説明。

○MS-DOSにおけるVERコマンドの仕様

機能 : DOSのバージョン番号を表示する。内部コマンド。
対応OS : MS-DOS Version 2.0以降
書式 : VER [/R]
スイッチ : /R - リビジョン管理情報とDOSのハイメモリ領域での動作状況を表示する[MS-DOS 5.0以降]
終了コード : なし
補足 : バージョン番号の小数点以下の文字だけが変わるようなマイナーバージョンアップ(リビジョンアップ)はVERコマンドには反映されていないことがある。
例えばIBMのDOS 5.02はDOS 5.00、NECのMS-DOS 3.3AはMS-DOS 3.30など。

※Windowsでの変更点

書式 : VER
スイッチ : なし
終了コード : 0 - 正常終了、1 - 異常終了(コマンドの書式が誤っている。)
補足 : Windows XPまではバージョン番号とともにOS名もきちんと表示されていたが、
Windows XP Professional x64 EditionとWindows Server 2003 x64版で同じカーネルを用いたのをきっかけにOS名の表示は"Microsoft Windows"だけになる。
代わりにXPで追加されたSYSTEMINFOコマンドを用いて完全なOS名を取得できる。

○SYSTEMINFO

機能 : 基本システム構成情報を参照する。外部コマンド。
対応OS : Microsoft Windows XP以降
書式 : SYSTEMINFO [/S システム [/U ユーザー名 [/P パスワード]]] [/FO 形式] [/NH]
スイッチ : /S システム - 接続先のリモートシステム(コンピューター名やIPアドレスなど)を指定する。
/U [ドメイン\]ユーザー - 実行するコマンドのユーザーを指定する。
/P [パスワード] - ユーザーのパスワードを指定する。パスワードを省略した場合は入力を要求する。
/FO 形式 - 出力形式を("TABLE","LIST","CSV")で指定する。このスイッチを省略するとLIST形式で出力される。
/NH - 項目名を省略して値のみを出力する。
終了コード : 0 - 正常終了、1 - 異常終了(コマンドの書式が誤っている、リモートシステムに接続できない、など。)
補足 : 対応OSはWindows XP以降だがWindows XP Home Editionでは利用できない。
/S、/U、/Pスイッチはネットワーク上のコンピューターの情報を取得する際に利用する。

○FIND

機能 : テキストファイル(複数可)から指定された文字列を検索し、それを含む行を表示する。外部コマンド。
対応OS : MS-DOS Version 2.0以降
書式 : FIND [/V] [/C] [/N] [/I] [/S] "文字列" [[ドライブ:][パス]ファイル名[...]]
スイッチ : /V - 指定した文字列を含まない行を表示する。
/C - 指定した文字列を含む行の数だけを表示する。
/N - 行番号を表示する。
/I - 大文字と小文字の区別をしないで検索する[MS-DOS 5.0以降]
/S - サブディレクトリも検索する[PC DOS 7.0]
"文字列" - 検索する文字列を指定する。
[ドライブ:][パス]ファイル名 - 検索するファイル(複数可) を指定する。
終了コード : 0 - 指定した文字列が1箇所以上見つかった。
1 - 検索は正常に終了したが指定した文字列が見つからなかった。
2 - 異常終了(コマンドの書式が誤っている、検索対象のファイルが存在しない、など。)
補足 : 引用符「"」を検索文字列に指定するには「""」とする必要がある。
検索対象ファイルを指定する代わりにパイプを利用することで、コマンドの出力結果を処理することができる。
検索対象を指定しなかった場合は標準入力(キーボード)から入力される文字列を処理する。
PC DOS 7.0のみ/Sスイッチと検索ファイル指定にワイルドカード("*"と"?")を利用できる。
コードページが932の場合、テキストファイルの文字コードがシフトJIS以外だと正しく処理できない。

※Windowsでの変更点

書式 : FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "文字列" [[ドライブ:][パス]ファイル名[...]]
スイッチ : /OFF[LINE] - オフライン属性が設定されたファイルをスキップしない。
補足 : 検索ファイルの指定にワイルドカード("*"と"?")を利用できるようになった。
MS-DOSではワイルドカードをサポートしていないが、FORコマンドと組み合わせることで同様の処理ができる。
/OFFスイッチはオフラインファイルを検索対象に含める場合に付ける。

○更新履歴

  • 12/10/30 Windows Server 2012に対応
  • 12/06/07 Windows Server 2003,2008で正しく処理されない問題を修正
  • 11/05/23 一部削除とコマンドの補足
  • 11/05/08 一部削除と修正
  • 10/12/05 いろいろ修正
  • 10/10/25 作成

旧ブログでのコメント

DATE: 2012/06/07 15:07:37
Unknown
OS分岐バッチ参考にさせていただきました。

実験してみた所、Winodws 2003でsysteminfoを実行した場合正常に認識されない不具合が発生しましたので確認してみた所、原因は2つありました。

Systeminfo.exeの結果をみると、
"Microsoft(R) Windows(R) Server 2003, Standard Edition"
の文字列が帰ってきておりますことから
1.FINDの文字内に(R)が必要
2."で括られた中に,が入っておりますため、osverに代入された値が
"Microsoft(R) Windows(R) Server 2003
となってしまうことから"で閉じていないため、その後に続けたコマンドが文字列と認識されてしまう。

ということがわかりました。

既にご存知でしたら済みませんが、かなり役立つバッチコマンドでしたので修正していた抱いたほうがよいかと思いコメントさせていただきました。

AUTHOR: akm
URL:
DATE: 2012/06/07 20:49:18
WinSrvでの動作について
>>takaさん。
コメント・ご指摘ありがとうございます。

Windows Serverについては動作を確認する環境がなかったため誤りに気付きませんでした。
たまたま手元にWindows Server 2008 RC0があったのでそれでテストしてみたところ、(1)の現象については確認できました。
(2)については確認できませんでした。,で区切られてしまう問題は解決できそうにありませんが、"については%~aとすることでこれを取り除いています。
どうしてもWin2003で完全なOSの名前を抜き出す必要があれば、別記事に掲載したとおりWMICコマンドを使う方法を試してみて下さい。


comments powered by Disqus

※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい.

(C) 2008-2017 akm. This blog theme is based on sakmug. Hosted by Xdomain