リダイレクトの仕様変更について

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が立ち上がっているということはなく),この解釈は誤りではないかと思われる.

参考


はたいたかし
http://exlight.net/
2005-03-08
Home > 開発ツール > Windows > コマンドライン ツール