Windows9x系OSでは,バッチファイルからのリダイレクトができない仕様だったため, バッチファイルから標準出力・標準エラー出力に出力されるデータをリダイレクトするためには以下のように コマンドインタプリタを起動してその引数としてバッチファイルをわたしていた (この方法であれば出力はバッチファイルではなくコマンドインタプリタからのものであるためリダイレクトが効く).
> command /C foo.bat >foo.out
Windows2000/XPではバッチファイルについてもリダイレクトが効く仕様になったため,このような工夫は必要なくなっている.
# | 実行するコマンド | 結果 |
---|---|---|
(a) |
> foo.bat > echo %A%
|
OK
|
(b) |
> cmd.exe /C foo.bat > echo %A%
|
%A%
|
資料によっては,“コマンドラインにリダイレクトを含むバッチファイルが指定されると自動的に新しいコマンドインタプリタが起動される”
というような説明が書いてある場合があるが,実際の動作はそうでもないようだ.
というのが,もし“foo.bat >foo.out
”を“cmd.exe /C foo.bat >foo.out
”に変換してから実行しているとすると,
foo.bat
中でset
など副作用をもつコマンドを実行した場合の結果が違ってくるはずなのに,実際にはそうはなっていない.
例えば,foo.bat
に“set A=OK
”と書いてあった場合,前者(a)ではバッチファイル実行後のecho %A%
はOK
となり,
後者(b)ではecho %A%
→%A%
(A
が未定義のため%A%
のまま)となるはずである.
実際にやってみると結果は(a)となり,少なくとも(a)を(b)に変換してから実行しているわけではないことがわかる.
また,foo.bat
の中からtasklist.exe
を呼び出して起動中のプロセス一覧を取得しても,プロセス数の変化はなく
(新しいcmd.exe
が立ち上がっているということはなく),この解釈は誤りではないかと思われる.
setA.bat
foo.bat
をsetA.bat
と読み替えて実行tasklist
は現在実行中のプロセス一覧を表示するコマンド.必要に応じてコメントをはずす.