[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 7はどんな新時代を切り開くのか? (2009/8/27)
次期クライアントOS「Windows 7」の新コーナーがスタート。Vistaの後継となる新OSの実力やいかに。今回はWindows 7の概要について解説 - 第186話 ハードディスクの一生 (2009/8/25)
年を追うごとに大容量・低価格化が急速に進むハードディスク。いやがうえにも新陳代謝が進む。現役を退いたディスクの末路は… - WindowsTIPS (2009/8/21)
− アドレス表記を変更してIEのゾーンを切り替える
− Windows 7がインストール可能かどうかをチェックする
− Windows 7のエクスペリエンス・インデックス(WEI) - PDF編集ツール4製品のスペックを横並び比較 (2009/8/19)
文書交換・配布に利用されているPDF文書を直接修正できるPDF編集ツール。どのような編集ができるのか? 編集以外の機能も充実している4製品を比較する
|
|
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
- - PR -
お勧め求人情報
**先週の人気講座ランキング**
〜UNIX/Linux〜
◆ | テストツールを導入しても結果が伴わない なぜ? JaSSTメンバがその真相に迫る! New! |
◆ | UTMだからといってあきらめていませんか 境界防御はフルスペックのFW+IPSで臨め New! |
◆ | その日のうちに効果を実感できる WAN最適化アプライアンスのススメ New! |
◆ | クラウドとデータセンターの融合の中で、 失敗しないために必要な10の要件とは? |
◆ | これで分かる!「ログを使いこなす方法」 立ち見が出るほどの会場で語られたことは |
◆ | もう「ITリソースの過不足」に悩まない! “隣のサーバ”のメモリとCPUを活用せよ |
◆ | 経営コンサルの国家資格、中小企業診断士 ITエンジニアが注目するその理由とは? |
◆ | Javaの宿命、「Full GC」によるシステム 停止はどのようにしたら防げるだろうか? |
◆ | サービス開始の時のために覚えておきたい さくらインターネットの“価格破壊” |
◆ | これが最新のプロジェクト管理手法だ! 工事進行基準やコスト圧力に打ち勝つ方法 |