リダイレクト
コマンドプロンプトでコマンドを実行した際、その出力結果を画面ではなくファイルに保存したいケースがあります。
例えば、ログファイルの作成や、コマンドの実行結果を後から確認したい場合などです。
このようなケースで役立つのがリダイレクト機能です。
この記事では、コマンドプロンプトのリダイレクト機能について詳しく解説します。
リダイレクトとは
リダイレクトとは、コマンドの出力先を変更する機能です。
通常、コマンドの実行結果は画面(コマンドプロンプトのウィンドウ)に表示されますが、リダイレクトを使用することで、その出力をファイルに保存することができます。
コマンドプロンプトでは、以下のリダイレクト演算子を使用できます。
| 演算子 | 説明 |
|---|---|
> | 標準出力をファイルに上書き保存 |
>> | 標準出力をファイルに追記 |
2> | 標準エラー出力をファイルに上書き保存 |
2>> | 標準エラー出力をファイルに追記 |
2>&1 | 標準エラー出力を標準出力にマージ |
< | ファイルからの入力を受け取る |
標準出力と標準エラー出力
リダイレクトを理解するために、まず標準出力と標準エラー出力について説明します。
コマンドプロンプトでは、出力は以下の 2 種類に分類されます。
| 出力の種類 | 番号 | 説明 |
|---|---|---|
| 標準出力 | 1 | 通常のコマンド実行結果 |
| 標準エラー出力 | 2 | エラーメッセージや警告 |
例えば、dirコマンドでファイル一覧を表示した場合、その結果は標準出力に出力されます。
一方、存在しないファイルを削除しようとした場合のエラーメッセージは、標準エラー出力に出力されます。
標準出力をファイルに保存する(>)
>演算子を使用すると、コマンドの標準出力をファイルに保存できます。
コマンド > ファイル名
使用例
dirコマンドの結果をファイルに保存する例です。
上記のコマンドを実行すると、dirコマンドの結果がfilelist.txtに保存されます。
画面には何も表示されません。
保存されたファイルの内容を確認してみましょう。
>演算子を使用すると、指定したファイルが既に存在する場合は上書きされます。既存の内容は失われますのでご注意ください。
標準出力をファイルに追記する(>>)
>>演算子を使用すると、既存のファイルに内容を追記できます。
コマンド >> ファイル名
使用例
ログファイルに繰り返し追記する例です。
>>を使用することで、既存のファイルの末尾に新しい内容が追加されます。
標準エラー出力をファイルに保存する(2>)
2>演算子を使用すると、エラーメッセージをファイルに保存できます。
コマンド 2> ファイル名
使用例
存在しないファイルを削除しようとした場合のエラーをファイルに保存する例です。
エラーメッセージがerror.txtに保存されました。
2>>を使用すると、エラーメッセージを既存のファイルに追記できます。 標準出力と標準エラー出力を同一ファイルに保存する(2>&1)
通常の出力とエラーメッセージの両方を同じファイルに保存したい場合は、2>&1を使用します。
コマンド > ファイル名 2>&1
2>&1は「標準エラー出力(2)を標準出力(1)にマージする」という意味です。
使用例
このコマンドを実行すると、dirコマンドの結果とエラーメッセージの両方がoutput.txtに保存されます。
バッチファイルでの使用例
@echo off
setlocal
echo 処理を開始します...
:: 正常な処理(標準出力)
echo ファイルを処理中です
:: エラーが発生する可能性のある処理
copy 存在しないファイル.txt backup.txt
echo 処理が完了しました
endlocal
このバッチファイルを実行し、すべての出力をログファイルに保存する場合:
出力を抑制する(nulへの出力)
コマンドの出力を完全に抑制したい場合は、nulにリダイレクトします。
nulは特殊なファイルで、書き込まれた内容はすべて破棄されます。
コマンド > nul
使用例
上記のコマンドを実行しても、画面には何も表示されません。
標準出力と標準エラー出力の両方を抑制
コマンド > nul 2>&1
バッチファイルでよく使われるパターンです。
@echo off
setlocal
:: コマンドの出力を完全に抑制
copy sample.txt backup.txt > nul 2>&1
if errorlevel 1 (
echo コピーに失敗しました
) else (
echo コピーが完了しました
)
endlocal
入力リダイレクト(<)
<演算子を使用すると、ファイルからの入力をコマンドに渡すことができます。
コマンド < ファイル名
使用例
sortコマンドにファイルの内容を渡してソートする例です。
実践的なサンプルコード
ログファイルの作成
@echo off
setlocal
set LOGFILE=process_log.txt
:: ログファイルの初期化(日時を記録)
echo ========================================= > %LOGFILE%
echo 処理開始: %DATE% %TIME% >> %LOGFILE%
echo ========================================= >> %LOGFILE%
:: 処理内容をログに記録
echo カレントディレクトリ: %CD% >> %LOGFILE%
echo. >> %LOGFILE%
echo ファイル一覧: >> %LOGFILE%
dir /b >> %LOGFILE% 2>&1
:: 処理終了
echo. >> %LOGFILE%
echo 処理終了: %DATE% %TIME% >> %LOGFILE%
echo ログファイルを作成しました: %LOGFILE%
endlocal
エラーログの分離
@echo off
setlocal
:: 標準出力とエラー出力を別々のファイルに保存
mycommand.exe > success.log 2> error.log
:: エラーがあったか確認
if exist error.log (
for %%A in (error.log) do (
if %%~zA GTR 0 (
echo エラーが発生しました。error.log を確認してください。
) else (
echo 正常に完了しました。
)
)
)
endlocal
練習問題
まとめ
リダイレクトは、コマンドプロンプトで作業を行う際に非常に便利な機能です。
主なポイント:
>:標準出力をファイルに上書き保存>>:標準出力をファイルに追記2>:標準エラー出力をファイルに保存2>&1:標準エラー出力を標準出力にマージ> nul:出力を完全に抑制<:ファイルからの入力
これらの機能を活用することで、ログファイルの作成やエラー処理、バッチファイルの自動化がより効率的に行えるようになります。