【bat】長時間処理で画面スクロールが遅いときの対処法|echo制御

バッチファイルで大量の処理を実行すると、コンソール画面に表示されるログが膨大になり、画面スクロールが極端に遅くなることがあります。
特にループ処理で繰り返し echo を出している場合、描画負荷で処理速度そのものが低下するケースもあります。
本記事では、このような長時間処理のパフォーマンス低下を防ぐための echo 制御方法を解説します。

原因:大量の画面出力が処理を遅くする

コマンドプロンプトは、表示する文字が多ければ多いほど描画処理に時間を使います。
バッチファイルでは、以下のようなケースでスクロールが重くなりがちです。

  • ループ内で毎回 echo している
  • 詳細なデバッグ出力を常に画面に出している
  • エラーログや進捗を大量に表示している

対策1:@echo off で不要な出力を抑制

バッチファイルの先頭に @echo off を書くと、コマンドそのものの表示を抑えられます。
これにより「実行行の表示」が消え、画面スクロールの量を減らせます。

@echo off
rem コマンド実行はされるが、行自体は表示されない
dir C:\Windows

対策2:echo を必要最低限にする

ループ内で逐一 echo すると出力が膨大になります。
進捗確認が不要なら echo を削除し、必要なときだけ「件数」や「終了報告」を出力するのが効果的です。

@echo off
set COUNT=0
for %%F in (*.txt) do (
  set /a COUNT+=1
  rem 個別の echo はしない
)
echo 処理した件数: %COUNT%

対策3:出力をファイルにリダイレクトする

画面に表示する代わりにログファイルに保存すれば、スクロールの遅延を防げます。
必要に応じて処理後にファイルを確認すればよいでしょう。

@echo off
rem 標準出力を log.txt に保存
dir /s C:\ > log.txt

rem 標準エラーもまとめて保存する場合
dir /s C:\ > log.txt 2>&1

対策4:画面とファイルの両方に出す(PowerShell 併用)

「リアルタイムで進捗を見たいがログも残したい」ときは、PowerShell の Tee-Object を使うのが便利です。

@echo off
dir /s C:\ 2>&1 | powershell -NoProfile -Command "tee -FilePath log.txt"

対策5:進捗表示を簡略化する

処理中に目安を確認したいときは、毎回ではなく一定間隔で出力するように制御すると負荷が減ります。

@echo off
setlocal EnableDelayedExpansion
set COUNT=0
for %%F in (*.txt) do (
  set /a COUNT+=1
  if !COUNT! lss 100 (
    rem 100件未満は表示しない
  ) else (
    echo !COUNT! 件目まで処理完了
    set COUNT=0
  )
)
endlocal

まとめ

長時間処理で画面スクロールが遅くなる原因は、大量の echo による描画負荷です。
基本的には @echo off を利用し、出力は必要最低限に絞ること。
ログが必要ならリダイレクトでファイルに保存し、進捗は一定間隔で表示するのが効果的です。
これによりバッチ処理の実行速度を維持しつつ、必要な情報も確保できます。