コマンドプロンプト上で利用できる dir や date のような非ウィンドウソフトは、 コマンドプロンプトのウィンドウ画面上に出力を表示します。 また、set /p のようなコマンドはキーボードから入力をもらいます。 これらの出力、入力は、
この標準出力、標準入力は、 コマンドプロンプトの リダイレクションの機能を利用すれば、 それらを (コマンド毎に) ファイルに切り替えることができます。 コマンドへの標準入力をファイルへ切り替えるには、 コマンド (やオプションパラメータ) の後ろに入力リダイレクション
を追加します。 これは、対話的に入力が必要なコマンドへの固定入力を自動化するのに利用できます。
< [ファイル名]
コマンドの標準出力をファイルに切り替えるには、 コマンド (やオプションパラメータ) の後ろに出力リダイレクション
を追加します。これはコマンドの出力を保存するのに使えます。
> [ファイル名]
入力も出力もファイルに切り替えるには、コマンドの後ろに
を追加します。この場合、 ファイル 1 とファイル 2 は別な名前でないと問題が起こるでしょう。 なお、この指定の順は逆でもいいようです。
< [ファイル1] > [ファイル2]
例えば、
(先頭の > はプロンプト) とすると画面には何も表示されず、 「abc」(と最後に改行) だけが書かれたテキストファイル f1.dat が作られます。 さらに、
> echo abc > f1.dat
とすれば、入力待ちにはならず直ちに set コマンドが終了し、 環境変数 s に abc という文字列が代入されます。
> set /p s=リダイレクトテスト < f1.dat
出力リダイレクションには、もう 1 つ、追加出力の
という形式もあります。 これは、指定したファイルが存在しない場合は > と同じで そのファイルが新規に作られるのですが、 指定したファイルが既に存在する場合は、
>> [ファイル名]
一方、パイプ は、コマンドの標準出力を、 そのまま別のコマンドの標準入力として渡すときに使います。 記号は | です。例えば、
とすると、コマンド comA と comB の両方が起動され、 comA の標準出力が、そのまま comB の標準入力に流されます。 これと同じことはリダイレクションを用いて、
> comA | comB
としても行えるのですが、パイプの方が 1 行で済みますし、 中間ファイル f1.dat のようなものを必要としません。 しかもパイプは多段階につなぐことも可能で、例えば
> comA > f1.dat
> comB < f1.dat
とすれば、コマンド comA,comB,comC が起動され、 comA の標準出力が comB の標準入力として渡され、 その comB の標準出力が comC の標準入力として 渡されることになります。 これとリダイレクションを組み合せることも可能で、例えば、
> comA | comB | comC
とすると、f1.dat に対する comA の処理の結果が comB に、 その処理の結果が comC に渡され、 その結果が f2.dat として保存されることになります。
> comA < f1.dat | comB | comC > f2.dat
標準入力からデータをもらって、 標準出力にその処理結果を書き出すソフトを フィルタ と呼びますが、 この例からもわかるように、 パイプはフィルタを組み合わせてデータを加工するのに向いている仕組みです。 一つ一つのフィルタが単一の機能しかなくても、 複数のフィルタを組み合わせることで、 流れ作業的にデータの複雑な加工処理が行えます。
MS-Windows に用意されている使えそうなフィルタには、
などがあり、これらについては 7 節で説明しますが、 MS-Windows に標準的に用意されているフィルタはそれほど多くはありません。 C 言語が使えるなら、必要なものを自作するのもいいでしょう。
more, type, copy, echo
次に、パイプやリダイレクションと関係が深い 2 つの特別な疑似ファイル (デバイスファイル) con と nul について説明します。
これらは入力、出力の両方に使えますが、いずれも定義済みのファイルで、
よって逆にこの名前のファイルを作ることはできません。
これらの入力、出力は表 2 のようになっています。
でファイル fileA と同じ内容の fileB を作るコマンドですが、
>copy fileA fileB
とすると、コピー元のファイルが標準入力なのでキーボードからの入力待ちとなり、 その後キーボードで入力したものが直接 fileB に保存されます。 この場合入力を終了するには、Ctrl-Z を入力します。
> copy con fileB
一方、nul は入力も出力も何もしない疑似ファイルで、 例えば 4.4 節で見たように、
として、コマンド comA の標準出力を消すことができますし、
> comA > nul
とすれば、サイズ 0 のファイル fileA を作ることができます。
> copy nul fileA
なお、コマンドの出力先は標準出力以外にもうひとつ、 標準エラー出力 (stderr) と呼ばれるものがあり、 ここへの出力は > ではリダイレクトすることができず、 普通は常に画面に表示されます。 コマンドのエラーメッセージなどはここに出力されることが多いので、 それは > nul で消すことはできません。 標準エラー出力をリダイレクトする場合は、2> を用います。 例えば、type コマンドで fileA と fileB を連結して fileC を作る場合、
とすると、type コマンドは fileA, fileB の名前を標準エラー出力に表示しますが、
> type fileA fileB > fileC
とすれば、それも出なくなります。 ただし、2 と > の間にスペースを開けてはいけません。
> type fileA fileB > fileC 2> nul
竹野茂治@新潟工科大学