異なるOSで実行されるバッチファイルで、OSによって処理を分岐させたい場合がある。OSごとに個別のバッチファイルを用意する方法もあるが、環境変数「comspec」を参照すれば、Windows 9x系のOSとWindows NT系の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
バッチファイルを作成して定型処理を実行するというのは、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の構成によって、デフォルトの環境変数は変化するので注意が必要)。
以下の表では、ページ制作の都合から、OSごとに表を分離した。1つの表で全体を見るには、以下のリンクから別ページを表示していただきたい。
環境変数 | 値(Windows NT Workstation 4.0) |
---|---|
ALLUSERSPROFILE | |
APPDATA | |
CLIENTNAME | |
CommonProgramFiles | |
COMPUTERNAME | HELIOS |
ComSpec | C:\WINNT\system32\cmd.exe |
HOMEDRIVE | C: |
HOMEPATH | \ |
LOGONSERVER | |
NUMBER_OF_PROCESSORS | 1 |
OS | Windows_NT |
Os2LibPath | C:\WINNT\system32\os2\dll; |
Path | C:\WINNT\system32;C:\WINNT |
PATHEXT | .COM;.EXE;.BAT;.CMD |
PROCESSOR_ARCHITECTURE | x86 |
PROCESSOR_IDENTIFIER | x86 Family 7 Model 1 Stepping 2, GenuineIntel |
PROCESSOR_LEVEL | 7 |
PROCESSOR_REVISION | 102 |
ProgramFiles | |
PROMPT | $P$G |
SESSIONNAME | |
SystemDrive | C: |
SystemRoot | C:\WINNT |
TEMP | C:\TEMP |
TMP | C:\TEMP |
USERDOMAIN | HELIOS |
USERNAME | Administrator |
USERPROFILE | C:\WINNT\Profiles\Administrator |
winbootdir | |
windir | C:\WINNT |
デフォルトの環境変数の調査結果(Windows NT Workstation 4.0) Windows NT Workstation 4.0をインストールして、デフォルトで設定されている環境変数を調査した結果。ここでコンピュータ名は「HELIOS」、セットアップ先のフォルダは全て既定値とし、「Administrator」でログオンしている。表中の空欄は環境変数が存在しないという意味。 |
環境変数 | 値(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 |
ComSpec | C:\WINNT\system32\cmd.exe |
HOMEDRIVE | C: |
HOMEPATH | \ |
LOGONSERVER | \\HELIOS |
NUMBER_OF_PROCESSORS | 1 |
OS | Windows_NT |
Os2LibPath | C:\WINNT\system32\os2\dll; |
Path | C:\WINNT\system32;C:\WINNT; C:\WINNT\System32\Wbem |
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 |
SESSIONNAME | |
SystemDrive | C: |
SystemRoot | C:\WINNT |
TEMP | C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp |
TMP | C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp |
USERDOMAIN | HELIOS |
USERNAME | Administrator |
USERPROFILE | C:\Documents and Settings\Administrator |
winbootdir | |
windir | C:\WINNT |
デフォルトの環境変数の調査結果(Windows 2000 Professional) Windows 2000 Professionalをインストールして、デフォルトで設定されている環境変数を調査した結果。ここでコンピュータ名は「HELIOS」、セットアップ先のフォルダは全て既定値とし、「Administrator」でログオンしている。表中の空欄は環境変数が存在しないという意味。 |
環境変数 | 値(Windows XP Professional) |
---|---|
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 |
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 |
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 |
SESSIONNAME | Console |
SystemDrive | C: |
SystemRoot | C:\WINDOWS |
TEMP | C:\DOCUME~1\Taro\LOCALS~1\Temp |
TMP | C:\DOCUME~1\Taro\LOCALS~1\Temp |
USERDOMAIN | HELIOS |
USERNAME | Taro |
USERPROFILE | C:\Documents and Settings\Taro |
winbootdir | |
windir | C:\WINDOWS |
デフォルトの環境変数の調査結果(Windows XP Professional) Windows XP Professionalをインストールして、デフォルトで設定されている環境変数を調査した結果。ここでコンピュータ名は「HELIOS」、セットアップ先のフォルダは全て既定値とし、「Taro」というユーザーでログオンしている。表中の空欄は環境変数が存在しないという意味。 |
環境変数 | 値(Windows 98SE) |
---|---|
ALLUSERSPROFILE | |
APPDATA | |
CLIENTNAME | |
CommonProgramFiles | |
COMPUTERNAME | |
ComSpec | C:\WINDOWS\COMMAND.COM |
HOMEDRIVE | |
HOMEPATH | |
LOGONSERVER | |
NUMBER_OF_PROCESSORS | |
OS | |
Os2LibPath | |
Path | C:\WINDOWS;C:\WINDOWS\COMMAND |
PATHEXT | |
PROCESSOR_ARCHITECTURE | |
PROCESSOR_IDENTIFIER | |
PROCESSOR_LEVEL | |
PROCESSOR_REVISION | |
ProgramFiles | |
PROMPT | $p$g |
SESSIONNAME | |
SystemDrive | |
SystemRoot | |
TEMP | C:\WINDOWS\TEMP |
TMP | C:\WINDOWS\TEMP |
USERDOMAIN | |
USERNAME | |
USERPROFILE | |
winbootdir | C:\WINDOWS |
windir | C:\WINDOWS |
デフォルトの環境変数の調査結果(Windows 98SE) Windows 98SEをインストールして、デフォルトで設定されている環境変数を調査した結果。ここでコンピュータ名は「HELIOS」、セットアップ先のフォルダは全て既定値とし、システムでのログオン操作は行っていない。表中の空欄は環境変数が存在しないという意味。 |
表から、全ての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
なおバッチファイルの拡張子は、Windows NT/2000/XPでは「.bat」と「.cmd」のいずれも使用できるが、MS-DOSやWindows 9xでは「.bat」に限られる。そのため、この種のバッチファイルでは、拡張子を必ず「.bat」にする必要がある。
■この記事と関連性の高い別の記事
Copyright© Digital Advantage Corp. All Rights Reserved.