覚え書き: バッチファイル

以下は本当はがっつりバッチファイルについて調べてエントリ化しようと思ったが、途中で目的を達成してしまったが為にただの残骸となってしまった文章である(ノ∀`)


Windowsにおけるバッチファイルとは

バッチファイル(バッチプログラム/スクリプト)

型式が決まっている繰り返し作業等の一連の処理をWindows上で自動的に実行バッチ処理する為の手順をWindowsコマンドで記述したテキストファイル。

時代背景等、より詳しい内容は以下を参照。
batchが指すものは何か? IT業界独自の概念「一般化」を理解しよう

batch
(パン・陶器などの)ひとかまど、ひと焼き分、1 度分、ひと束、一群、一団

script
(演劇・映画・ラジオ放送などの)台本、脚本、スクリプト、手書き、筆跡、筆記体(活字)、スクリプト体、文字、答案


拡張子の違い (bat or cmd)

拡張子にはbat,cmdが用いられる。

bat拡張子はDOS時代から使い続けられていて、cmd拡張子は32ビットOSのNT系以降で使用され始めた模様。

cmd拡張子は非NT系環境でそのスクリプトが実行されないようにする為に明示的にbatと使い分けがされていたようだが、今は非NT系のWindowsやDOS環境はほぼほぼ姿を消しており、また依然としてbat拡張子を使い続ける風潮があった為か、現在では基本的にどちらでも良いようである。

実行可能ファイルの拡張子を指定する環境変数「PATHEXT」には
".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC"
といった順で記載されているので、Microsoft的には特にbat拡張子を使わずにcmd拡張子を使えと強制はせず、もしも使い分けたいのであれば、ユーザー側で考えて選択しろということなのだろうか。

尚、細かな違いとして、ERRORLEVELが"0"でない状態で、"PATH/APPEND/PROMPT/SET/ASSOC"等を実行した場合、batだとERRORLEVELに以前の非"0"の値が残り、cmdでは"0"にリセットされるらしい。

例えば下記の内容を拡張子を変えて実行すると、

@echo off
type
PATH
echo %errorlevel%

以下のような結果になる。(typeコマンドがエラー 1を返すが結果が異なる。)

Windows batch files: .bat vs .cmd?


コマンドシェルとは

(コマンドラインシェル/コマンドラインプロセッサ/コマンドラインインタプリタ)

本義としてはユーザーがOSに命令・利用するためのユーザーインターフェイスを提供するプログラムであるが、バッチ処理という観点から見た場合、バッチファイル内の命令群を逐次解釈し、処理を行う実行エンジンと考えても差し支えはないと思われる。

NT系ではcmd.exeがデフォルトのコマンドシェルである。(それ以前はcommand.com)
このコマンドシェルの指定は環境変数「ComSpec」の値で決定される。
※Windows10でのデフォルト値は"%SystemRoot%system32cmd.exe"となっていた。

現行のWindows10では従来型のコマンドシェルとこれを拡張したPowerShellを利用できる。

PowerShellではWindowsコマンドの他により多くの処理が可能なPowerShellコマンドレットを実行できる。
具体的には.NET Frameworkのクラスを利用できる。

Windows のコマンド

この他にスクリプト実行環境としてWindows Scripting Host(WSH)がある。
こちらはVBScriptやJScriptで記述し、WMIを始めとするCOMオブジェクトを利用できる。

WSH環境は上記のコマンドシェルと異なり、ファイルとして存在するスクリプトを実行する。

つまり上記のコマンドシェルのようなユーザーインターフェイス的部分がない単純な実行エンジンと言える。
バッチファイルすらまだまだ現役なので、当然ながらWSHもまだまだ現役である模様。


色々調べてて思ったけど、もう今更バッチファイルについて勉強するならWSHやPowerShellの勉強をしたほうがいいなってちょっと思った(ノ∀`)