[System Environments] | ||||||||||||||||||
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」と記述すればよい。
使用方法 |
まずは、以下のバッチ・ファイルをご覧いただきたい。
|
|
実行された環境に応じたメッセージを表示する例 |
このバッチ・ファイルでは、環境変数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コマンドを使った文字列表示しか行っていないが、「:<ラベル名>」から「goto end」までの間に複数行の処理を記述できる点が、先のサンプルと異なる。そこで、echoコマンドに代えて任意の処理を記述すればよい。
なお、このようなバッチ・ファイルを作成する際には、それぞれの分岐処理の末端で「goto end」と記述しておき、一方、バッチ・ファイルの末尾には「:end」と記述して、対応するラベルを作成しておく必要がある。そうしないと、バッチ・ファイル中に記述された処理を次々に実行してしまい、条件分岐が成立しないからだ。
最後に、この手法を実際に利用して、「マイ ドキュメント」フォルダに保存されているファイルやフォルダを、すべてE:ドライブにコピーするバッチ・ファイルの例を記しておく。自分が作成したドキュメント一式を、MOドライブなどにコピーする際に利用できるだろう。
|
|
「マイ ドキュメント」フォルダに保存されているファイルやフォルダを、すべてE:ドライブにコピーするバッチ・ファイルの例 |
なおバッチ・ファイルの拡張子は、Windows NT/2000/XPでは「.bat」と「.cmd」のいずれも使用できるが、MS-DOSやWindows
9xでは「.bat」に限られる。そのため、この種のバッチ・ファイルでは、拡張子を必ず「.bat」にする必要がある。
|
「Windows TIPS」 |
TechTargetジャパン
- Windows 8で必要なMicrosoftアカウントを作成する (2012/9/7)
マイクロソフトのさまざまインターネット・サービスを利用するために必要な「Microsoftアカウント」。Windows 8を使う上で必須のものとなる。その作成方法は? - クラウドOSを目指すWindows Server 2012 (2012/9/6)
オンプレミスからクラウドまで幅広くカバーする、機能強化が進んだ新サーバOS、Windows Server 2012の連載開始 - 第330話 パソコンに欲しい機能は? (2012/9/4)
昔に比べたら、いまのパソコンは実に高機能になった。それでも、まだまだ欲しい機能はある - autorunsツールで自動起動するプログラムを調査する (2012/8/31)
Sysinternalsのautorunsツールを使えば、自動起動するプログラムやサービス、ドライバ、DLL、シェル拡張機能、IEのアドオンなどを網羅的に調査できる
|
|
キャリアアップ
- - PR -
イベントカレンダー
- - PR -
お勧め求人情報
転職/派遣情報を探す
**先週の人気講座ランキング**
〜 Android編 〜
ホワイトペーパー(TechTargetジャパン)
「ITmedia マーケティング」新着記事
第2回 メーカーサイトでもここまで分かる貢献度
ページビュー、ユーザー数、広告のビューやクリック数……。Webのアクセス解析で一般的な...
「あのひと」買いを行っている人は全体の35.4%〜調査データランキングTOP10
「調査のチカラ」で人気がある調査データを紹介します。「日本人の意外なアイス事情」や...
いつかやる時のために、Facebookキャンペーンの開催に必要な手順
Facebookを使って初めてキャンペーンを実施する時に「まずするべきこと」や「考えたほう...