コマンド リダイレクト演算子を使用する
リダイレクト演算子を使って、既定の場所から別の場所に、コマンドの入出力ストリームをリダイレクトできます。入力ストリームまたは出力ストリームの場所を、ハンドルと呼びます。
次の表は、利用できるハンドルを示しています。
|
ハンドル
|
ハンドルに対応する数値
|
説明
|
|---|
STDIN | 0 | キーボード入力。 |
STDOUT | 1 | コマンド プロンプト ウィンドウへの出力。 |
STDERR | 2 | コマンド プロンプト ウィンドウへのエラーの出力。 |
UNDEFINED | 3-9 | ハンドルはアプリケーションによって個別に定義され、各ツールで固有です。 |
0 から 9 までの数値は、最初の 10 のハンドルを表します。Cmd.exe を使ってプログラムを実行し、最初の 10 のハンドルから任意のハンドルをプログラムにリダイレクトすることができます。使用するハンドルを指定するには、リダイレクト演算子の前にハンドルの数値を入力します。ハンドルを定義しないと、既定の < リダイレクト入力演算子は 0 で、既定の > リダイレクト出力演算子は 1 になります。< または > 演算子を入力した後、データの読み取りまたは書き込みを行う場所を指定する必要があります。ファイル名または別の既存ハンドルを指定できます。
既存ハンドルにリダイレクトを指定するには、アンパサンド (&) 文字を使用し、その後にリダイレクトするハンドルの数値を続けます (&<ハンドル番号> のように指定します)。たとえば、次のコマンドはハンドル 2 (STDERR) をハンドル 1 (STDOUT) にリダイレクトします。
2>&1
次の表は、入出力ストリームのリダイレクトに使用できる演算子を示しています。
|
リダイレクト演算子
|
説明
|
|---|
> | コマンド プロンプト ウィンドウやハンドルの代わりに、ファイルまたはデバイス (プリンタなど) にコマンドの出力を書き込みます。 |
< | コマンドの入力を、キーボードやハンドルからの入力の代わりに、ファイルから読み取ります。 |
>> | 既にファイルにある情報を削除しないで、ファイルの最後にコマンドの出力を追加します。 |
>& | あるハンドルからの出力を別のハンドルの入力に書き込みます。 |
<& | あるハンドルからの入力を読み取り、別のハンドルの出力に書き込みます。 |
| | あるコマンドからの出力を読み取り、別のコマンドの入力に書き込みます。パイプとも呼ばれます。 |
既定では、コマンドの入力 (STDIN ハンドル) をキーボードから Cmd.exe に送り、Cmd.exe はコマンドの出力 (STDOUT ハンドル) をコマンド プロンプト ウィンドウに送ります。
入力をリダイレクトする (<)
キーボードからの入力をファイルやデバイスにリダイレクトするには、< 演算子を使用します。たとえば、sort コマンドへの入力を File.txt から取得するには、次のように入力します。
sort<file.txt
file.txt の内容が、コマンド プロンプト ウィンドウにアルファベット順に一覧表示されます。
< 演算子は、指定されたファイルを読み取り専用アクセスで開きます。そのため、この演算子を使用するとファイルへの書き込みはできません。たとえば、<&2 を使用してプログラムを開始すると、ハンドル 2 は最初に書き込み専用アクセスで開かれているため、ハンドル 0 の読み取りはすべて失敗します。
注
-
< リダイレクト入力演算子の既定ハンドルは 0 です。
出力をリダイレクトする (>)
ほとんどすべてのコマンドは、出力をコマンド プロンプト ウィンドウに送ります。ドライブまたはプリンタに出力を送るコマンドでも、メッセージとプロンプトはコマンド プロンプト ウィンドウに表示されます。
出力をコマンド プロンプト ウィンドウからファイルやデバイスにリダイレクトするには、> 演算子を使用します。> 演算子は、ほとんどのコマンドで使用できます。たとえば、dir の出力を dirlist.txt にリダイレクトするには、次のように入力します。
dir>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 を開いて内容を並べ替えてから、その出力をコマンド プロンプト ウィンドウ (STDOUT) に送るには、次のように入力します。
sort<file.txt
file.txt を検索してから、Search.txt にハンドル 1 (STDOUT) とハンドル 2 (STDERR) をリダイレクトするには、次のように入力します。
findfile file.txt>search.txt 2<&1
ユーザー定義のハンドル 3 をハンドル 0 (STDIN) への入力読み取りで複製するには、次のように入力します。
<&3
& 演算子を使用して出力および複製をリダイレクトする
出力をファイルにリダイレクトする場合に既存のファイル名を指定すると、Cmd.exe はその既存のファイルを書き込み専用で開いてファイルの内容を上書きします。ハンドルを指定すると、Cmd.exe は既存のハンドルにファイルを複製します。
ユーザー定義のハンドル 3 をハンドル 1 に複製するには、次のように入力します。
>&3
ハンドル 2 (STDERR) を含むすべての出力を ipconfig コマンドからハンドル 1 (STDOUT) にリダイレクトし、その出力を Output.log にリダイレクトするには、次のように入力します。
ipconfig.exe>>output.log 2>&1
>> リダイレクト演算子を使用して出力を追加する
既にファイルに入っている情報を失わずに、コマンドからの出力をファイルの終わりに追加するには、二重の不等号 (>>) を使います。たとえば、次のコマンドは、dir コマンドで生成されたディレクトリ一覧を dirlist.txt ファイルに追加します。
dir>>dirlist.txt
netstat コマンドの出力を tcpinfo.txt の終わりに追加するには、次のように入力します。
netstat>>tcpinfo.txt
パイプ演算子 (|) を使用する
パイプ演算子 (|) は、あるコマンドの出力 (既定では STDOUT) を取り出し、別のコマンドの入力 (既定では STDIN) にリダイレクトします。たとえば、次のコマンドは、ディレクトリを並べ替えます。
dir | sort
この例では、両方のコマンドが同時に開始されますが、sort コマンドは dir コマンドの出力を受け取るまで一時停止します。sort コマンドは dir コマンドの出力を入力として使用し、その後、出力をハンドル 1 (STDOUT) に送ります。
コマンドをリダイレクト演算子と組み合わせる
他のコマンドやファイル名とフィルタ コマンドを合わせて、カスタム コマンドを作成できます。たとえば、次のコマンドを使うと、文字列 "LOG" が入っているファイルの名前を格納できます。
dir /b | find "log" loglist.txt
dir コマンドの出力は、find フィルタ コマンドを通じて送られます。文字列 "LOG" が入っているファイル名は、ファイル名 (たとえば、NetshConfig.log、Logdat.svd、Mylog.bat など) の一覧として Loglist.txt ファイルに格納されます。
同じコマンドで複数のフィルタを使うには、フィルタをパイプ (|) で区切ります。たとえば、次のコマンドは、ドライブ C のすべてのディレクトリを検索し、文字列 "Log" が入っているファイル名をすべて見つけて、コマンド プロンプト ウィンドウで一度に 1 画面分ずつ表示します。
dir c:\ /s /b | find "log" | more
パイプ (|) を使うことにより、find フィルタ コマンドを通じて dir コマンドの出力を送るように、Cmd.exe に指示します。find コマンドにより、文字列 "LOG" が入っているファイル名のみが選択されます。more コマンドにより、find コマンドで選択されたファイル名が、コマンド プロンプト ウィンドウで一度に 1 画面分ずつ表示されます。フィルタ コマンドの詳細については、「フィルタを使用する」を参照してください。