Windowsコマンド実行結果のリダイレクト、パイプ

コンピュータ上で実行されているプログラムが、特に何も指定されていない場合に利用するデータの入力元/出力先として、標準入力/標準出力がある。
また、プログラム内でエラーが発生した場合、標準エラー出力に対して出力が行われる(標準出力とは別に指定されている)。

コマンドプロンプトにおいて、標準入力はキーボード(キー入力)、標準出力/標準エラー出力はモニター(画面表示)になっている。

リダイレクトを使うと、標準入力/標準出力/標準エラー出力を変更することができる。

また、標準出力へデータを書き出すプログラムと、標準入力からデータを受け取るプログラムがある時に、パイプを使用することで、前のプログラムが出力したデータを、次のプログラムが直接入力して実行させることができる。

リダイレクトやパイプを使用する事で、キーボード入力作業の自動化や、実行結果をログファイルとして記録するなどが出来る。


標準出力/標準エラー出力をリダイレクト

いずれのリダイレクトでも、出力先のファイルが存在しない場合は自動的に新規作成される。
出力先のファイルが既に存在している場合、リダイレクトの指定方法によって挙動が変わる。

やりがちなミスとして、標準出力のみをリダイレクトして、エラー部分が画面に表示されてしまうことがある。
特にこだわりが無いなら、標準出力と標準エラー出力は同じ出力先にした方が良い。

rem 標準出力をファイルに変更(上書き)
rem 既にファイルが存在している場合は上書きされ、元の内容は無くなる
rem 以下の2コマンドは同じ意味(「1>」の 1 は省略可能)
dir *.aaa > stdout.txt
dir *.aaa 1> stdout.txt


rem 標準出力をファイルに変更(追記)
rem 既にファイルが存在している場合は末尾に追記される
rem 以下の2コマンドは同じ意味(「1>>」の 1 は省略可能)
dir *.aaa >> stdout.txt
dir *.aaa 1>> stdout.txt


rem 標準エラー出力をファイルに変更(上書き)
dir *.aaa 2> stderr.txt


rem 標準エラー出力をファイルに変更(追記)
dir *.aaa 2>> stderr.txt


rem 標準出力と標準エラー出力を別々のファイルに変更(上書き)
dir *.aaa > stdout.txt 2> stderr.txt


rem 標準出力と標準エラー出力を別々のファイルに変更(追記)
dir *.aaa >> stdout.txt 2>> stderr.txt


rem 標準出力と標準エラー出力を同じファイルに変更(上書き)
rem 標準エラー出力を標準出力にリダイレクトして、
rem 標準出力側に合流させるようなイメージ
dir *.aaa > result.txt 2>&1


rem 標準出力と標準エラー出力を同じファイルに変更(追記)
dir *.aaa >> result.txt 2>&1


rem コマンドの実行結果を出力しない
rem 「nul」は空のファイルという意味で、書き込んでも何も起きない
rem 結果的に、実行結果の出力は捨てられて、どこにも残らない
rem 実行結果が出力されないだけで、コマンド自体は実行されている
dir *.aaa > nul 2>&1

標準入力をリダイレクト

rem 標準入力をファイルに変更
rem ファイルの内容が入力として読み込まれる
rem 以下の2コマンドは同じ意味(「0<」の 0 は省略可能)
sort < stdin.txt
sort 0< stdin.txt


rem 標準入力と標準出力/標準エラー出力をファイルに変更
rem stdin.txt ファイルの内容が入力されて、
rem 実行結果(エラー含む)が result.txt ファイルに出力される
sort < stdin.txt > result.txt 2>&1

パイプ

rem 複数のコマンドをパイプで連結
rem 以下のコマンドを実行すると、
rem dir コマンドによって出力されたファイルのリストが、
rem sort コマンドによってソートされて、
rem clip コマンドによってクリップボードにコピーされる
dir * | sort | clip


rem エラー出力も含めて次のコマンドにパイプ
dir *.aaa 2>&1 | sort | clip


rem 上記のパイプと同等の内容をリダイレクトで実現
rem パイプの方がシンプルだが、
rem 途中の実行結果を残したい場合は、こちらを使用する
dir * > temp-dir.txt 2>&1
sort < temp-dir.txt > temp-sort.txt
clip < temp-sort.txt

タイトルとURLをコピーしました