Windows TIPS
[System Environments]
  Windows TIPS TOPへ
Windows TIPS全リストへ
内容別分類一覧へ

OSの種類によってバッチ・ファイルの処理を切り替える方法

解説をスキップして使用方法を読む

  井上孝司
2003/01/21
対象OS
Windows 95
Windows 98
Windows 98 SE
Windows Me
Windows NT
Windows 2000 Professional
Windows XP Professional
Windows XP Home Edition
Windows 2000 Server
Windows 2000 Advanced Server
異なるOSで実行されるバッチ・ファイルで、OSによって処理を分岐させたい場合がある。
OSごとに個別のバッチ・ファイルを用意する方法もあるが、環境変数「comspec」を参照すれば、Windows 9x系のOSとWindows NT系のOSを区分して、別々の処理を実行するバッチ・ファイルを作成可能である。


解説

 バッチ・ファイルを作成して定型処理を実行するというのは、MS-DOSの時代から用いられて来た手法である。Windows 98からは、より高機能なスクリプト言語としてWSH(Windows Scripting Host)が実装された。このWSHを使用する方が柔軟で多様な処理を実現できるが、単純なコマンド・ベースのファイルのコピーやバックアップなど、いまなおバッチ・ファイルで用が足りる局面も少なくない。実際、筆者は、いまでも2台のコンピュータの間でデータをバックアップ・コピーする際に、バッチ・ファイルを使用している。

 複数バージョンのWindows OSを利用している環境では、バッチ・ファイルを利用する際に、同じバッチ・ファイルを、Windows 9x系のOS(Windows 95/98/Me)と、Windows NT系のOS(Windows NT/2000/XP)の双方で実行する可能性が考えられる。その際に、OSの違いによって処理内容を分岐する必要に迫られる場合がある。

 例えば、[マイ ドキュメント]フォルダの内容をコピーする際に、Windows 9x/Meならコピー元は「C:\My Documents」に固定されていると考えてよいが、Windows NTやWindows 2000/XPでは、使用中のユーザーによって場所が異なる点が問題になる。具体的には、Windows NT 4.0では「C:\WINNT\Profiles\」の下に、Windows 2000/XPでは「C:\Documents and Settings」の下に、それぞれユーザー名と同一名のプロファイル・フォルダがあり、その下に「My Documents」フォルダが存在する(いずれもデフォルト時)。Windows NT 4.0/2000/XPなら、userprofileという環境変数があり、これにプロファイル・フォルダのパスが格納されているのだが、Windows 9x系OSにはこのような環境変数は用意されていない(詳細は後述)。つまり、Windows 9xを含むすべてのWindows OSで有効な、[マイ ドキュメント]フォルダのパスを指定する方法はない。

 もちろん、OSごとに別々のバッチ・ファイルを作成すれば、こうした問題は解決できるのだが、メンテナンスの手間が増えることを考えると、バッチ・ファイル自身にOSの違いを認識させ、処理を分岐させる方が合理的な場合が多い。

 WSHと異なり、バッチ・ファイルの機能は限定的だが、すべてのOSで設定されている環境変数で、OSごとに独自の値が設定されているものを見付ければこれは可能である。

 そこで、同じコンピュータにWindows 98 SE、Windows NT Workstation 4.0、Windows 2000 Professional、Windows XP Professionalをインストールして確認したところ、OSによって自動的に設定される環境変数として、以下のものが確認できた(ただしOSの構成によって、デフォルトの環境変数は変化するので注意が必要)。

 以下の表では、ページ制作の都合から、2つのOSずつ表を分離した。 1つの表で全体を見るには、以下のリンクから別ページを表示していただきたい。

表を別ページで表示する

環境変数 Windows NT Workstation 4.0 Windows 2000 Professional
ALLUSERSPROFILE C:\Documents and Settings\All Users
APPDATA C:\Documents and Settings\Administrator\Application Data
CLIENTNAME
CommonProgramFiles C:\Program Files\Common Files
COMPUTERNAME HELIOS HELIOS
ComSpec C:\WINNT\system32\cmd.exe C:\WINNT\system32\cmd.exe
HOMEDRIVE C: C:
HOMEPATH \ \
LOGONSERVER \\HELIOS
NUMBER_OF_PROCESSORS 1 1
OS Windows_NT Windows_NT
Os2LibPath C:\WINNT\system32\os2\dll; C:\WINNT\system32\os2\dll;
Path C:\WINNT\system32;C:\WINNT C:\WINNT\system32;C:\WINNT;
C:\WINNT\System32\Wbem
PATHEXT .COM;.EXE;.BAT;.CMD .COM;.EXE;.BAT;.CMD;.VBS;.VBE;
.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE x86 x86
PROCESSOR_IDENTIFIER x86 Family 7 Model 1 Stepping 2, GenuineIntel x86 Family 15 Model 1 Stepping 2,
GenuineIntel
PROCESSOR_LEVEL 7 15
PROCESSOR_REVISION 102 102
ProgramFiles C:\Program Files
PROMPT $P$G $P$G
SESSIONNAME
SystemDrive C: C:
SystemRoot C:\WINNT C:\WINNT
TEMP C:\TEMP C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp
TMP C:\TEMP C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp
USERDOMAIN HELIOS HELIOS
USERNAME Administrator Administrator
USERPROFILE C:\WINNT\Profiles\Administrator C:\Documents and Settings\Administrator
winbootdir
windir C:\WINNT C:\WINNT
     
環境変数 Windows XP Professional Windows 98SE
ALLUSERSPROFILE C:\Documents and Settings\All Users
APPDATA C:\Documents and Settings\Taro\Application Data
CLIENTNAME Console
CommonProgramFiles C:\Program Files\Common Files
COMPUTERNAME HELIOS
ComSpec C:\WINDOWS\system32\cmd.exe C:\WINDOWS\COMMAND.COM
HOMEDRIVE C:
HOMEPATH \Documents and Settings\Taro
LOGONSERVER \\HELIOS
NUMBER_OF_PROCESSORS 1
OS Windows_NT
Os2LibPath
Path C:\WINDOWS\system32;C:\WINDOWS;
C:\WINDOWS\System32\Wbem
C:\WINDOWS;C:\WINDOWS\COMMAND
PATHEXT .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS
;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE x86
PROCESSOR_IDENTIFIER x86 Family 15 Model 1 Stepping 2, GenuineIntel
PROCESSOR_LEVEL 15
PROCESSOR_REVISION 102
ProgramFiles C:\Program Files
PROMPT $P$G $p$g
SESSIONNAME Console
SystemDrive C:
SystemRoot C:\WINDOWS
TEMP C:\DOCUME~1\Taro\LOCALS~1\Temp C:\WINDOWS\TEMP
TMP C:\DOCUME~1\Taro\LOCALS~1\Temp C:\WINDOWS\TEMP
USERDOMAIN HELIOS
USERNAME Taro
USERPROFILE C:\Documents and Settings\Taro
winbootdir C:\WINDOWS
windir C:\WINDOWS C:\WINDOWS
OS別に調査したデフォルトの環境変数
複数のWindows OSをインストールして、デフォルトで設定されている環境変数を調査した結果。ここでコンピュータ名は「HELIOS」、セットアップ先のフォルダはすべて既定値とした。またWindows XP Professionalでは「Taro」というユーザーでログオンし、ほかは「Administrator」でログオンしている。また、Windows 98 SEではシステムでのログオン操作を行っていない。表中の空欄は環境変数が存在しないという意味。

 表から、すべてのOSで必ず設定される「comspec」を使用できることが分かる。環境変数は本来、コマンド・プロンプトで使用するシェルのプログラム・ファイルを指定するためのもので、MS-DOSやWindows 9xでは「c:\command.com」、Windows NT/2000/XPでは「%SystemRoot%\system32\cmd.exe」が指定される(C:ドライブにOSをインストールしている場合)。

 バッチ・ファイル中では、「%環境変数名%」と記述すると、環境変数に設定された値を取得することができる。従ってバッチ・ファイル中で「%comspec%」と記述すれば、windows 9xでは「c:\command.com」、windows 2000では「c:\winnt\system32\cmd.exe」、Windows XPでは「c:\windows\system32\cmd.exe」の文字列がそれぞれ返される(既定値のセットアップ先フォルダを使用した場合)。

 また、Windows NT/2000/XPでは、OSのセットアップ先フォルダを環境変数「SystemRoot」で参照できるので、これを環境変数comspecと組み合わせることで、セットアップ先のフォルダが「C:\WINNT」でも「C:\Windows」でも、あるいは別のドライブやフォルダでも、違いを吸収できる。具体的には、「%systemroot%\system32\cmd.exe」と記述すればよい。


使用方法

 まずは、以下のバッチ・ファイルをご覧いただきたい。

@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系です
実行された環境に応じたメッセージを表示する例

 このバッチ・ファイルでは、環境変数comspecが「c:\command.com」の場合(3行目)と「%systemroot%\system32\cmd.exe」の場合(4行目)とで、それぞれ異なる文字列をechoコマンドを使って表示させている。Windows NT/2000とWindows XPではOSのセットアップ先フォルダが異なるが、それは環境変数「systemroot」を参照させることで解決している。

 このバッチ・ファイルをWindows 9xのコマンド・プロンプトで実行すれば、「MS-DOS、ないしWindows 9x系です」、Windows NT/2000/XPのコマンド・プロンプトで実行すれば「Windows NT/2000/XP系です」と表示されるはずだ。従って、分岐先の処理がそれぞれ1行で済む内容であれば、上記のバッチ・ファイルを修正し、echoコマンドの代わりに必要な処理を記述すればよい。

 OSごとに、複数行にまたがる処理を行いたいなら、バッチ・ファイル中にラベルを作成し、処理を分岐させることで解決できる。例えば次のようにする。

@echo off
if "%comspec%"=="" goto unknown
if "%comspec%"=="c:\command.com" goto Win9x
if "%comspec%"=="%systemroot%\system32\cmd.exe" goto WinNT

:unknown
echo OSの種類が分かりません
goto end

:Win9x
echo MS-DOS、ないしWindows 9x系です
goto end

:WinNT
echo Windows NT/2000/XP系です
goto end

:end
バッチ・ファイル中にラベルを作成して分岐させ、複数行の処理を行えるようにした例

 ここでは、分岐先でも先の例と同様にechoコマンドを使った文字列表示しか行っていないが、「:<ラベル名>」から「goto end」までの間に複数行の処理を記述できる点が、先のサンプルと異なる。そこで、echoコマンドに代えて任意の処理を記述すればよい。

 なお、このようなバッチ・ファイルを作成する際には、それぞれの分岐処理の末端で「goto end」と記述しておき、一方、バッチ・ファイルの末尾には「:end」と記述して、対応するラベルを作成しておく必要がある。そうしないと、バッチ・ファイル中に記述された処理を次々に実行してしまい、条件分岐が成立しないからだ。

 最後に、この手法を実際に利用して、「マイ ドキュメント」フォルダに保存されているファイルやフォルダを、すべてE:ドライブにコピーするバッチ・ファイルの例を記しておく。自分が作成したドキュメント一式を、MOドライブなどにコピーする際に利用できるだろう。

@echo off
if "%comspec%"=="" goto unknown
if "%comspec%"=="c:\command.com" goto Win9x
if "%comspec%"=="%systemroot%\system32\cmd.exe" goto WinNT

:unknown
echo OSの種類が分かりません
goto end

:Win9x
xcopy "C:\My Documents" E:\ /S /E
goto end

:WinNT
xcopy "%userprofile%\my documents" e:\ /s /e
goto end

:end
「マイ ドキュメント」フォルダに保存されているファイルやフォルダを、すべてE:ドライブにコピーするバッチ・ファイルの例

 なおバッチ・ファイルの拡張子は、Windows NT/2000/XPでは「.bat」と「.cmd」のいずれも使用できるが、MS-DOSやWindows 9xでは「.bat」に限られる。そのため、この種のバッチ・ファイルでは、拡張子を必ず「.bat」にする必要がある。End of Article

この記事と関連性の高い別の記事

このリストは、デジタルアドバンテージが開発した自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。

generated byJigsaw
「Windows TIPS」

@IT Special

- PR -

TechTargetジャパン

Windows Server Insider フォーラム 新着記事
  • 第552話 怖い話 (2017/6/27)
     なにぃ、会社のトイレにお化けが出るって? あー、バカバカしい。ホラー映画の観過ぎじゃないの、まったく……
  • Azure SQL DBのインデックスやキャッシュを制御する (2017/6/26)
     Azure SQL Databaseのインデックスやプロシージャキャッシュを制御するには、そのためのT-SQLを直接実行する。知っておくと便利なT-SQLを紹介する
  • DNSのリゾルバ/キャッシュ/フォワーダ機能 (2017/6/23)
     今回は、DNSサーバのクライアント側であるリゾルバやキャッシュの機能について見ていく。リゾルバは、コンテンツDNSサーバに繰り返し問い合わせて名前解決を図る
  • ドメインの情報を提供するDNSのコンテンツサーバ (2017/6/22)
     DNSサーバには、ドメインの情報を定義・公開するコンテンツサーバと、それを利用するリゾルバの2種類がある。今回はコンテンツサーバの機能についてまとめておく
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る

ホワイトペーパーTechTargetジャパン

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間
ソリューションFLASH