Windowsで実行するコマンドまたはバッチジョブの動作をログに記録してトラブルシューティングする最も便利な方法の1つは、出力をファイルにリダイレクトすることです。
ただし、コマンドライン書き込みをファイルにリダイレクトする方法はいくつかあります。選択するオプションは、コマンド出力をどのように表示するかによって異なります。
Windowsコマンドプロンプト出力のしくみ(How Windows Command Prompt Output Works)
Windowsコンソール(コマンドプロンプト(command prompt))でコマンドを入力すると、そのコマンドからの出力は2つの別々のストリームに送られます。
- STDOUT:標準出力は、コマンドからの標準応答が送信される場所です。(Out)たとえば、DIRコマンドの標準応答は、ディレクトリ内のファイルのリストです。
- STDERR:標準エラー(Standard Error)は、コマンドに問題がある場合にエラーメッセージが表示される場所です。たとえば、ディレクトリにファイルがない場合、DIR(File)コマンド(DIR)は「FileNotFound」を標準エラー(Standard Error)ストリームに出力します。
これらの出力ストリームの両方について、出力をWindowsのファイルにリダイレクトできます。
標準出力のリダイレクトを新しいファイルに書き込みます(Redirect Standard Output Write to New File)
コマンドの標準出力をファイルにリダイレクトする方法は2つあります。1つは、コマンドを実行するたびに、コマンド出力書き込みを新しいファイルに送信することです。
これを行うには、コマンドプロンプトを開き、次のように入力します。
dir test.exe > myoutput.txt
>文字は、指定した名前のファイルにSTDOUTを出力するようにコンソールに指示します。
このコマンド(run this command)を実行すると、ファイルが存在しないというエラーを除いて、コマンドウィンドウに応答がないことがわかります。
これは、コマンドの標準出力がmyoutput.txtというファイルにリダイレクトされたためです。これで、ファイルはコマンドを実行したのと同じディレクトリに存在します。標準エラー出力は、通常どおり表示されます。
注(Note):コマンドを実行する前に、コマンドプロンプトのActiveDirectoryを変更するように注意してください。(change the active directory)このようにして、出力ファイルがどこに保存されているかを知ることができます。
コマンドウィンドウに「myoutput.txt」と入力すると、ファイルに送信された標準出力を表示できます。これにより、デフォルトのテキストファイルビューアでテキストファイルが開きます。ほとんどの人にとって、これは通常Notepad.exeです。
次に同じコマンドを実行すると、前の出力ファイルが削除されます。新しい出力ファイルは、最新のコマンドの出力で再作成されます。
同じファイル(Same File)へのリダイレクト標準出力(Standard Output)書き込み
同じファイルを上書きしたくない場合はどうなりますか?もう1つのオプションは、>ではなく>>を使用して出力ファイルにリダイレクトすることです。この例の場合、次のように入力します。
dir test.exe >> myoutput.txt
同じ出力が表示されます(エラーのみ)。
ただし、この場合、このコマンドは、出力ファイルを上書きする代わりに、新しい出力を既存の出力ファイルに追加します。
コマンドを実行して出力をファイルに追加するたびに、新しい標準出力が既存のファイルの最後に書き込まれます。
標準エラーをファイルにリダイレクトする(Redirect Standard Error To a File)
標準出力の書き込みをファイルにリダイレクトできるのと同じ方法で、標準エラーストリームをファイルに出力することもできます。
これを行うには、コマンドの最後に2>を追加し、その後に作成する出力エラーファイルを追加する必要があります。
この例では、次のコマンドを入力します。
dir test.exe > myoutput.txt 2> output.err
これにより、標準出力ストリームがmyoutput.txtに送信され、標準エラーストリームがoutput.errに送信されます。その結果、コンソールウィンドウに出力ストリームがまったく表示されなくなります。
ただし、output.errと入力すると、エラーメッセージが表示されます。これにより、デフォルトのテキストファイルビューアでファイルが開きます。
ご覧のとおり、コマンドからのエラーメッセージはすべてエラーファイルに出力されます。標準出力と同様に、代わりに>>を使用し(Just)>>、以前に実行したコマンドからのエラーにエラーを追加できます。
すべての出力書き込みを同じファイルにリダイレクトする(Redirect All Output Writes to a Same File)
上記のすべてのアプローチでは、複数のファイルが作成されます。1つのファイルは標準出力ストリーム用で、もう1つは標準エラーストリーム用です。
これらの出力の両方を同じファイルに含めたい場合は、それも行うことができます。これを行うには、次のコマンドを使用して、すべての出力を同じファイルにリダイレクトする必要があります。
dir test.exe 1> myoutput.txt 2>&1
このコマンドの仕組みは次のとおりです。
- 標準出力は、出力番号1で識別される出力ファイルに送られます。
- 番号2で識別される標準エラー出力は、番号1で識別される出力ファイルにリダイレクトされます。
これにより、エラー出力が標準出力の最後に追加されます。
これは、1つのファイル内の任意のコマンドのすべての出力を確認するための便利な方法です。
標準またはエラー出力ストリームのサイレンシング(Silencing Standard or Error Output Streams)
出力をファイルではなくNUL(NUL)にリダイレクトすることにより、標準出力(Standard Output)または標準エラー(Standard Error)のいずれかをオフにすることもできます。
上記の例を使用して、標準出力(Standard Output)のみが必要で、標準エラー(Standard Error)がまったく必要ない場合は、次のコマンドを使用できます。
dir test.exe 1> myoutput.txt 2>nul
これにより、標準出力(Standard Output)のみをリダイレクトした上記の最初の例と同じ出力ファイルが作成されますが、このコマンドを使用すると、エラーはコンソール内にエコーされません。エラーログファイルも作成されません。
これは、エラーを気にせず、迷惑にならないようにする場合に便利です。
BATファイル内(inside a BAT file)から上記と同じ出力コマンドのいずれかを実行でき、その行からの出力は指定した出力ファイルに送られます。これは、 BAT(BAT)ファイル内のコマンドを実行しようとしたときにエラーが発生したかどうかを確認するのに便利な方法です。
Redirect Output from the Windows Command Line to a Text File
One of the most useful ways to log and troubleshoot the behavior of cоmmands or batch jоbs that you run on Windows is to redirect output to a file.
However, there are a few different ways you can redirect command line writes to a file. The option you choose depends on how you want to view your command output.
How Windows Command Prompt Output Works
When you type a command in the Windows console (command prompt), the output from that command goes to two separate streams.
- STDOUT: Standard Out is where any standard responses from commands go. For example the standard response for the DIR command is a list of files inside a directory.
- STDERR: Standard Error is where any error messages go if there’s a problem with the command. For example if there aren’t any files in the directory, the DIR command will output “File Not Found” to the Standard Error stream.
You can redirect output to a file in Windows for both of these output streams.
Redirect Standard Output Write to New File
There are two ways you can redirect standard output of a command to a file. The first is to send the command output write to a new file every time you run the command.
To do this, open the command prompt and type:
dir test.exe > myoutput.txt
The > character tells the console to output STDOUT to the file with the name you’ve provided.
When you run this command, you’ll notice that there isn’t any response in the command window except the error that the file doesn’t exist.
This is because the standard output for the command was redirected to a file called myoutput.txt. The file now exists in the same directory where you ran the command. The standard error output still displays as it normally does.
Note: Be careful to change the active directory for the command prompt before running the command. This way you’ll know where the output files are stored.
You can view the standard output that went to the file by typing “myoutput.txt” in the command window. This will open the text file in your default text file viewer. For most people, this is usually Notepad.exe.
The next time you run the same command, the previous output file will be deleted. A new output file will be recreated with the latest command’s output.
Redirect Standard Output Writes to the Same File
What if you don’t want to overwrite the same file? Another option is to use >> rather than > to redirect to an output file. In the case of this example, you would type:
dir test.exe >> myoutput.txt
You’ll see the same output (the error only).
But in this case, instead of overwriting the output file, this command appends the new output to the existing output file.
Every time you run a command and append the output to a file, it’ll write the new standard output to the end of the existing file.
Redirect Standard Error To a File
The same way you can redirect standard output writes to a file, you can also output the standard error stream to a file.
To do this, you’ll need to add 2> to the end of the command, followed by the output error file you want to create.
In this example, you’ll type the command:
dir test.exe > myoutput.txt 2> output.err
This sends the standard output stream to myoutput.txt, and the standard error stream to output.err. The result is that no output stream at all gets displayed in the console window.
However, you can see the error messages by typing output.err. This will open the file in your default text file viewer.
As you can see, any error messages from the command are output to the error file. Just as with the standard output, you can use >> instead to append the error to errors from previously run commands.
Redirect All Output Writes to a Same File
All of the approaches above result in multiple files. One file is for the standard output stream and the other is for the standard error stream.
If you want to include both of these outputs to the same file, you can do that too. To do this, you just need to redirect all output to the same file using the following command.
dir test.exe 1> myoutput.txt 2>&1
Here’s how this command works:
- The standard output is directed to the output file identified by output number 1.
- The standard error output identified by the number 2 is redirected to the output file identified by number 1.
This will append the error output to the end of the standard output.
This is a useful way to see all output for any command in one file.
Silencing Standard or Error Output Streams
You can also turn off either Standard Output or Standard Error by redirecting the output to a NUL instead of a file.
Using the example above, if you only want Standard Output and no Standard Error at all, you can use the following command:
dir test.exe 1> myoutput.txt 2>nul
This will result in the same output file as the first example above where you only redirected the Standard Output, but with this command the error won’t echo inside the console. It won’t create an error log file either.
This is useful if you don’t care about any errors and don’t want them to become a nuisance.
You can perform any of the same output commands above from inside a BAT file and the output from that line will go to the output file you specify. This is a useful way to see whether any commands within a BAT file had any errors when they tried to run.