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

異なるOSで実行されるバッチファイルで、OSによって処理を分岐させたい場合がある。OSごとに個別のバッチファイルを用意する方法もあるが、環境変数「comspec」を参照すれば、Windows 9x系のOSとWindows NT系のOSを区分して、別々の処理を実行するバッチファイルを作成可能である。

» 2003年01月21日 05時00分 公開
[井上孝司]
「Tech TIPS」のインデックス

連載目次

対象: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

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

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

「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

AI for エンジニアリング
「サプライチェーン攻撃」対策
1P情シスのための脆弱性管理/対策の現実解
OSSのサプライチェーン管理、取るべきアクションとは
Microsoft & Windows最前線2024
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。