1. ホーム
  2. スクリプト・コラム
  3. DOS/BAT(ドス・バット

cmdコマンドのリダイレクト出力 2>&1 解説

2022-01-08 19:42:23

cmdコマンドのリダイレクト出力について 2>&1

mycommand >mylog.txt 2>&1 が最も古典的な使い方になるはずです。

コマンドの結果は、"%>"の形で出力に向けることができる。%はファイルディスクリプタを示す。

標準出力stdoutの場合は1、標準エラーstderrの場合は2です。

システムのデフォルトの%値は「1」で、「1>」は「>」と省略できます。stdoutのデフォルトのターゲットはターミナルで、stderrのデフォルトのターゲットもターミナルとなります。echo text >result.txt とバッチで実行すると、画面には echo text 1>result.txt と表示される、つまりこういうことである。
ここで、&はリダイレクト記号と直接組み合わせて使用する必要があります。

応用例です。

1. 結果をresult.txtに出力する

net stop myservices >>result 2>&1

2. プログラム出力の非表示

net stop myservices >nul 2>nul

リダイレクトに関するマイクロソフトの記事:コマンドのリダイレクト演算子を使用する

redirect 演算子を使用すると、コマンドの入力および出力データ ストリームをデフォルトの場所から別の場所にリダイレクトすることができます。入力または出力データストリームの場所は、ハンドルと呼ばれます。
使用できるハンドルの一覧は次のとおりです。

ハンドル名 ハンドルの数値指定 説明
STDIN 0
キーボード入力
STDOUT 1
コマンドプロンプトウィンドウへの出力
STDERR 2
コマンドプロンプトウィンドウへのエラー出力
未定義 3-9
ハンドルはアプリケーションによって個別に定義され、各ツールに固有のものである

0から9の数字は、最初の10個のハンドルを表します。Cmd.exeというコマンドでプログラムを実行し、最初の10個のハンドルのいずれかにリダイレクトすることができます。使用するハンドルを指定するには、redirect 演算子の前にそのハンドルの番号を入力します。ハンドルが定義されていない場合、デフォルトの<リダイレクト入力演算子は0、デフォルトの>リダイレクト出力演算子は1になります。 <または>演算子を入力した後、データを読み書きする場所を指定する必要があります。ファイル名または他の既存のハンドルを指定することができる。
既存のハンドルへのリダイレクトを指定するには、with (&) 文字の後にリダイレクトするハンドル番号 (& ハンドル番号) を指定します。

たとえば、次のコマンドは、ハンドル2(すなわち、STDERR)をハンドル1(すなわち、STDOUT)にリダイレクトします。

2>&1

次の表は、入出力データストリームをリダイレクトするために使用できる演算子の一覧です。

リダイレクション演算子説明
> コマンド出力を、コマンドプロンプトのウィンドウやハンドルではなく、ファイルやデバイス(プリンタなど)に書き込みます。
< キーボードやハンドルからではなく、ファイルからコマンド入力を読み取る。
>> 既にファイルにある情報を削除せずに、コマンド出力をファイルの末尾に追加します。
>& あるハンドルの出力を別のハンドルの入力に書き込む。
<& あるハンドルから入力を読み取り、別のハンドルの出力に書き込む。
| あるコマンドから出力を読み取り、それを別のコマンドの入力に書き込む。パイプラインともいう。

デフォルトでは、コマンド入力(すなわちSTDINハンドル)をキーボードからCmd.exeに送信し、コマンド出力(すなわちSTDOUTハンドル)をコマンドプロンプトウィンドウに送信することが可能です。

入力のリダイレクト (<)

キーボードからの入力をファイルやデバイスにリダイレクトするには、<演算子を使用します。たとえば、ソートコマンドの入力を File.txt から取得するには、次のように入力します。

ソート {{file.txt {{/file.txt

File.txtの内容が、コマンドプロンプトウィンドウにアルファベット順のリストとして表示されます。

は、その

< 演算子は、指定されたファイル名を読み取り専用で開きます。したがって、この演算子を使用している間は、ファイルに情報を書き込むことはできません。例えば、<&2 でプログラムを開始した場合、ハンドル 0 を読もうとすると、ハンドル 2 が最初に書き込み専用アクセスで開かれているため、すべて失敗します。

注意点

0 は、< リダイレクト入力演算子のデフォルトハンドルです。

出力をリダイレクトする(>)

ほとんどすべてのコマンドは、コマンドプロンプトウィンドウに出力を送信します。ドライブやプリンタに出力するコマンドでも、メッセージやプロンプトがコマンドプロンプトウィンドウに表示されます。

コマンドプロンプトウィンドウからの出力をファイルまたはデバイスにリダイレクトするには、>演算子を使用します。この演算子は、多くのコマンドで使用することができます。たとえば、dir の出力を Dirlist.txt にリダイレクトするには、次のように入力します。

ディレクトリ>dirlist.txt

Dirlist.txtが存在しない場合、Cmd.exeはファイルを作成します。Dirlist.txtが存在する場合、Cmd.exeはファイル内の情報をdirコマンドの出力に置き換えます。

netsh routing dump コマンドを実行し、その出力を Route.cfg に送信するには、次のように入力します。

netsh routing dump>c:\route.cfg

は、その

演算子 > は、指定したファイルを書き込み専用で開くことができます。したがって、この演算子を使用してファイルを読み込むことはできません。例えば、リダイレクト演算子 >&0 でプログラムを開始した場合、ハンドル 0 が最初に読み取り専用アクセスで開かれたため、ハンドル 1 に書き込もうとするとすべて失敗します。

注意点

1 は、> リダイレクト出力演算子のデフォルトハンドルです。
コピーハンドル
リダイレクト演算子 & は、指定したハンドルからの出力または入力を、別の指定したハンドルにコピーします。例えば、dir出力をFile.txtに、エラー出力をFile.txtに送るには、次のように入力します。

dir>c:\file.txt 2>&1

ハンドルをコピーすると、そのハンドルの元の状態のプロパティをすべてコピーすることができます。たとえば、ハンドルに読み取り専用アクセス属性がある場合、そのハンドルのすべてのコピーには読み取り専用アクセス属性が付きます。読み取り専用アクセス属性を持つハンドルを、書き込み専用アクセス属性を持つ別のハンドルにコピーすることはできません。

入力とコピーのリダイレクトを&演算子で行う

リダイレクト入力演算子(<)とコピー演算子(&)を併用する場合は、指定したファイルがすでに存在している必要があります。入力ファイルが存在する場合、Cmd.exe はそのファイルを読み取り専用で開き、ファイルに含まれる文字をこのコマンドへの入力として送信します(キーボードからの入力と同じように)。ハンドルが指定された場合、Cmd.exe は指定されたハンドルをシステム上の既存のハンドルにコピーします。

たとえば、File.txt をハンドル 0 入力読み込み(つまり、STDIN)として開くには、次のように入力します。

{{file.txt {{/file.txt

File.txtを開き、内容をソートした後の出力をコマンドプロンプトウィンドウ(STDOUTなど)に送るには、次のように入力します。

ソート {{file.txt {{/file.txt

File.txtを見つけ、ハンドル1(つまりSTDOUT)とハンドル2(つまりSTDERR)をSearch.txtにリダイレクトするには、次のように入力します。

findfile file.txt>search.txt 2<&1

ユーザー定義のハンドル 3 をハンドル 0 の入力読み取り(つまり STDIN)としてコピーするには、次のように入力します。

<&3

演算子による出力のリダイレクトとコピー

出力がファイルにリダイレクトされ、既存のファイル名が指定された場合、Cmd.exe は書き込み専用としてファイルを開き、その内容を上書きします。ハンドルが指定された場合、Cmd.exe は、既存のハンドルにファイルをコピーします。

ユーザー定義のハンドル 3 をハンドル 1 にコピーするには、次のように入力します。

>&3

ipconfigコマンドからのハンドル2(つまりSTDERR)を含むすべての出力をハンドル1(つまりSTDOUT)にリダイレクトし、その出力をOutput.logにリダイレクトするには、次のようにタイプします。

ipconfig.exe>>output.log 2>&1

リダイレクト演算子 >> による出力の追加

ファイル内の情報を失うことなくコマンドの出力をファイルの末尾に追加するには、2 つの連続した大なり記号 (すなわち >>) を使用します。たとえば、dir コマンドで生成されたディレクトリの一覧を Dirlist.txt ファイルに追加するには、次のコマンドを使用します。

dir>>dirlist.txt

Tcpinfo.txtの末尾にnetstatコマンドの出力を追加するには、次のように入力します。

netstat>>tcpinfo.txt

パイプ演算子(|)を使用する

パイプ演算子(|)は、あるコマンドの出力(デフォルトではSTDOUT)を取り出し、それを別のコマンドの入力(デフォルトではSTDIN)に導くことができます。例えば、次のコマンドを使ってディレクトリをソートすることができます。

dir|ソート

この例では、両方のコマンドが起動されますが、sortコマンドはdirコマンドの出力を受け取るまで一時停止します。sortはdirコマンドの出力を入力として使用し、その出力をハンドル1(すなわちSTDOUT)に送信します。

リダイレクト演算子でコマンドをマージする

カスタムコマンドは、フィルターコマンドを他のコマンドやファイル名と結合して作成することができます。たとえば、次のコマンドを使用すると、文字列 "LOG" を含むファイル名を保存することができます。

dir /b | find "log" loglist.txt

の出力は

dirコマンドの出力は、find filterコマンドで送信されます。文字列 "LOG" を含むファイル名は、ファイル Loglist.txt にファイル名のリストとして格納されます (たとえば、NetshConfig.log、Logdat.svd、Mylog.bat など)。

同じコマンドで複数のフィルターを使用するには、パイプ (|) でフィルターを区切ります。たとえば、次のコマンドは、C ドライブ上のすべてのディレクトリで、文字列「LOG」を含むファイル名を検索し、コマンドプロンプトウィンドウに一度に 1 画面ずつ表示します。

dir c:\ /s /b | find "log" | more

パイプ (|) を使って、Cmd.exe が find フィルタコマンドで dir の出力を送るように指示できます。find は、文字列 "LOG" を含むファイル名だけを選択します。more は find コマンドで選択したファイル名を表示します (コマンド プロンプト ウィンドウに一度に 1 画面ずつ)。

cmdコマンド リダイレクト出力 2>&1に関するこの記事が全てです。cmdリダイレクト出力に関する詳しい情報は、BinaryDevelopの過去の記事を検索するか、以下の関連記事を引き続きご覧ください。