Windows TIMEOUTコマンド完全ガイド【バッチファイルで待機処理を実装】

バッチファイルを作成していて、「処理と処理の間に少し待ち時間を入れたい」と思ったことはありませんか?

Windowsの TIMEOUTコマンドは、まさにそんな時に使える便利なコマンドです。

指定した秒数だけ処理を一時停止できます。

この記事では、TIMEOUTコマンドの使い方を基礎から実践的な活用方法まで詳しく解説します。

スポンサーリンク
  1. TIMEOUTコマンドとは
  2. 基本的な構文
    1. パラメータの説明
  3. 基本的な使い方
    1. 10秒間待機する
    2. 30秒間待機する(キー入力で中断可能)
    3. 5秒間待機する(キー入力を無視)
    4. 無期限に待機する
  4. PAUSEコマンドとの違い
    1. PAUSEコマンドの特徴
    2. TIMEOUTコマンドの特徴
    3. どちらを使うべきか
  5. メッセージを非表示にする方法
    1. リダイレクトで非表示にする
    2. 完全に静かに待機
  6. バッチファイルでの実践例
    1. 例1: 処理の合間に待機
    2. 例2: カウントダウン表示
    3. 例3: 複数のアプリを順番に起動
    4. 例4: ファイルの出現を待つ
    5. 例5: ループ処理での待機
    6. 例6: エラー発生時のリトライ処理
  7. エラーレベル(ERRORLEVEL)について
    1. ERRORLEVELの値
    2. ERRORLEVELを使った分岐例
  8. 高度な使用例
    1. ログファイル付き定期実行バッチ
    2. ユーザー通知付き自動シャットダウン
    3. データベースバックアップスクリプト
  9. 注意点とトラブルシューティング
    1. /Tオプションは必須
    2. 秒数の制限
    3. リダイレクト時の挙動
    4. バックスペース文字の扱い
    5. Ctrl+Cでの中断
    6. Windows Vista以前では使えない
    7. 正確な時間ではない
  10. 代替手段との比較
    1. PINGコマンドを使う方法
    2. SLEEPコマンド
    3. PowerShellのStart-Sleep
  11. 実務での活用シーン
    1. サーバー再起動後の待機
    2. ログファイルのローテーション
    3. 定期的なスクリーンショット取得
    4. ネットワークドライブマッピングのリトライ
  12. よくある質問
    1. Q1: TIMEOUTコマンドはWindows 10/11で使えますか?
    2. Q2: 1秒未満の待機はできますか?
    3. Q3: バックグラウンドで実行したい
    4. Q4: キー入力を完全に無効化できますか?
    5. Q5: カウントダウンを非表示にしつつ、完了メッセージは表示したい
    6. Q6: 複数のTIMEOUTコマンドを連続実行できますか?
    7. Q7: タスクスケジューラから実行すると動きません
  13. まとめ

TIMEOUTコマンドとは

TIMEOUTは、コマンドプロンプトやバッチファイルで使用できるWindowsの標準コマンドです。

指定した秒数だけ、コマンドの実行を一時停止(待機)します。

Windows Vista以降のすべてのWindowsで標準搭載されています。

Linuxの「sleep」コマンドに相当する機能を持ちます。

バッチファイルで自動化処理を行う際、タイミング調整に欠かせないコマンドです。

基本的な構文

TIMEOUTコマンドの基本構文は以下の通りです。

TIMEOUT /T 秒数 [/NOBREAK]

パラメータの説明

/T 秒数

  • 必須パラメータ
  • 待機する秒数を指定
  • 指定できる範囲: -1 から 99999 秒
  • -1を指定すると、キーが押されるまで無期限に待機

/NOBREAK

  • オプションパラメータ
  • ユーザーのキー入力を無視
  • Ctrl+C以外では中断不可

/?

  • ヘルプを表示

基本的な使い方

まずは基本的な使用例から見ていきましょう。

10秒間待機する

timeout /t 10

実行すると、以下のように表示されます:

10 秒待っています。続行するには何かキーを押してください ...

秒数は自動的にカウントダウンされます。

何かキーを押すと、待機を中断して次の処理に進みます。

30秒間待機する(キー入力で中断可能)

timeout /t 30

30秒間待機しますが、途中で任意のキーを押すと中断できます。

ユーザーに「スキップ」の選択肢を与えたい場合に便利です。

5秒間待機する(キー入力を無視)

timeout /t 5 /nobreak

実行すると、以下のように表示されます:

5 秒待っています。終了するには CTRL+C を押してください ...

どのキーを押しても待機は続行されます。

Ctrl+Cを押すとバッチファイル全体が中断されます。

無期限に待機する

timeout /t -1

実行すると、以下のように表示されます:

続行するには何かキーを押してください ...

ユーザーがキーを押すまで無期限に待機します。

PAUSEコマンドと似た動作ですが、メッセージが微妙に異なります。

PAUSEコマンドとの違い

TIMEOUTとPAUSEはどちらも処理を一時停止しますが、違いがあります。

PAUSEコマンドの特徴

pause

メリット:

  • シンプルで覚えやすい
  • オプション不要

デメリット:

  • 時間指定ができない
  • ユーザーのキー入力が必須
  • 自動再開できない

TIMEOUTコマンドの特徴

timeout /t 10

メリット:

  • 秒数を指定できる
  • 自動的に再開する
  • キー入力の可否を選択できる

デメリット:

  • オプション指定が必須
  • PAUSEより少し複雑

どちらを使うべきか

PAUSEを使う場面:

  • ユーザーに必ず確認してもらいたい時
  • 「続けますか?」的な確認が必要な時
  • シンプルに一時停止したい時

TIMEOUTを使う場面:

  • 自動処理で一定時間待ちたい時
  • ユーザー不在でも動作させたい時
  • 時間制限付きの待機が必要な時

メッセージを非表示にする方法

TIMEOUTコマンドは、デフォルトで待機中のメッセージを表示します。

このメッセージを非表示にしたい場合があります。

リダイレクトで非表示にする

timeout /t 5 > nul

または

timeout /t 5 /nobreak > nul

「> nul」を付けることで、標準出力を破棄します。

画面に何も表示されず、静かに5秒待機します。

完全に静かに待機

timeout /t 10 /nobreak > nul

メッセージが一切表示されず、10秒間待機します。

ユーザーには待機していることが分かりません。

バックグラウンドで動作するバッチファイルに最適です。

バッチファイルでの実践例

実際のバッチファイルでどう使うか、例を見ていきましょう。

例1: 処理の合間に待機

@echo off
echo 処理1を実行中...
rem 何か処理をする

timeout /t 5 /nobreak > nul

echo 処理2を実行中...
rem 次の処理をする

処理1と処理2の間に5秒の待機を入れています。

メッセージは非表示にしています。

例2: カウントダウン表示

@echo off
echo プログラムを開始します...
echo 10秒後に自動的に開始されます
echo (すぐ開始するには何かキーを押してください)
timeout /t 10
echo プログラム開始!

ユーザーに準備時間を与えつつ、スキップも可能にしています。

例3: 複数のアプリを順番に起動

@echo off
echo Wordを起動します...
start "" "C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE"

echo 10秒待機中...
timeout /t 10 /nobreak

echo Excelを起動します...
start "" "C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE"

アプリケーションの起動タイミングをずらしています。

システムへの負荷を分散できます。

例4: ファイルの出現を待つ

@echo off
:wait_for_file
if exist "C:\temp\data.txt" goto file_found

echo ファイルを待機中...
timeout /t 5 /nobreak > nul
goto wait_for_file

:file_found
echo ファイルが見つかりました!
type "C:\temp\data.txt"

5秒ごとにファイルの存在を確認します。

ファイルが見つかるまで繰り返します。

例5: ループ処理での待機

@echo off
setlocal
echo ループを開始します...

for /L %%i in (1,1,5) do (
    echo %%i 回目の処理を実行中...

    if %%i==3 (
        echo 特別な処理中...(3秒待機)
        timeout /t 3 /nobreak > nul
    ) else (
        echo 通常の処理中...(1秒待機)
        timeout /t 1 /nobreak > nul
    )
)

echo すべての処理が完了しました
endlocal

条件によって待機時間を変えています。

ループ内での処理タイミングを制御できます。

例6: エラー発生時のリトライ処理

@echo off
set retry_count=0
set max_retries=3

:retry
set /a retry_count+=1
echo 接続試行中... (試行回数: %retry_count%/%max_retries%)

ping -n 1 192.168.1.100 > nul
if %errorlevel%==0 goto success

if %retry_count% geq %max_retries% goto failed

echo 5秒後に再試行します...
timeout /t 5 /nobreak
goto retry

:success
echo 接続成功!
goto end

:failed
echo 接続失敗: 最大試行回数に達しました
goto end

:end
pause

失敗時に間隔を空けて再試行します。

サーバーへの負荷を軽減できます。

エラーレベル(ERRORLEVEL)について

TIMEOUTコマンドは、終了時にERRORLEVELを設定します。

この値を使って、タイムアウトしたかキーが押されたかを判別できます。

ERRORLEVELの値

0

  • ユーザーがキーを押して中断した
  • /nobreakを使わなかった場合のみ

1以上

  • タイムアウトが満了した
  • Ctrl+Cで中断した場合
  • 通常は1が返る

負の値

  • エラーが発生した
  • 無効なパラメータなど

ERRORLEVELを使った分岐例

@echo off
echo 10秒待ちます。スキップするには何かキーを押してください...
timeout /t 10

if %errorlevel%==0 (
    echo キーが押されました。処理をスキップします。
) else (
    echo タイムアウトしました。通常処理を続行します。
)

ユーザーの選択によって処理を分岐できます。

高度な使用例

より実践的な活用例を紹介します。

ログファイル付き定期実行バッチ

@echo off
setlocal enabledelayedexpansion

set logfile=C:\logs\monitor_%date:~0,4%%date:~5,2%%date:~8,2%.log

:loop
set current_time=%time:~0,8%
echo [%date% %current_time%] システム監視を実行中... >> %logfile%

rem 監視処理(例: ディスク使用率チェック)
wmic logicaldisk get size,freespace,caption >> %logfile%

echo 次回実行まで30秒待機... >> %logfile%
timeout /t 30 /nobreak > nul

goto loop

30秒ごとにシステムを監視してログに記録します。

ユーザー通知付き自動シャットダウン

@echo off
echo ======================================
echo   自動シャットダウンスクリプト
echo ======================================
echo.
echo 60秒後にコンピュータがシャットダウンされます。
echo 中止するには Ctrl+C を押してください。
echo.

set countdown=60
:countdown_loop
echo 残り %countdown% 秒...
timeout /t 1 /nobreak > nul
set /a countdown-=1
if %countdown% gtr 0 goto countdown_loop

echo シャットダウンを実行します...
shutdown /s /t 0

カウントダウンを表示してユーザーに警告します。

データベースバックアップスクリプト

@echo off
setlocal

set backup_dir=D:\backups
set timestamp=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%
set timestamp=%timestamp: =0%

echo バックアップを開始します...
echo 日時: %date% %time%
echo.

echo データベースサービスを停止中...
net stop "MySQL80" > nul
timeout /t 5 /nobreak

echo ファイルをコピー中...
xcopy "C:\ProgramData\MySQL\Data" "%backup_dir%\%timestamp%\" /E /I /H /Y

echo データベースサービスを再起動中...
timeout /t 3 /nobreak
net start "MySQL80" > nul

echo.
echo バックアップ完了: %backup_dir%\%timestamp%\
pause

サービスの停止と再起動の間に待機を入れています。

注意点とトラブルシューティング

TIMEOUTコマンドを使う際の注意点を説明します。

/Tオプションは必須

timeout 10

このように書くとエラーになります。

正しくは:

timeout /t 10

/Tオプションを必ず付けてください。

秒数の制限

最小値: -1

  • -1は無期限待機を意味する特別な値

最大値: 99999

  • 約27時間まで指定可能

無効な値:

timeout /t 100000

100000秒以上は指定できません。

リダイレクト時の挙動

メッセージを非表示にした場合:

timeout /t 10 > nul

カウントダウンの数字が画面に表示されません。

ログファイルにも記録されません。

バックスペース文字の扱い

リダイレクトしてファイルに出力すると:

timeout /t 10 > output.txt

バックスペース文字(\x08)とカウントダウンの数字が含まれます。

ログファイルとして使用する場合は注意が必要です。

Ctrl+Cでの中断

/nobreakを使用していても、Ctrl+Cは有効です。

timeout /t 60 /nobreak

このコマンドでも、Ctrl+Cを押すとバッチファイル全体が終了します。

中断を完全に防ぐことはできません。

Windows Vista以前では使えない

TIMEOUTコマンドはWindows Vista以降で標準搭載されました。

Windows XP以前では使用できません。

XPで使う場合は、Resource Kitのインストールが必要です。

正確な時間ではない

TIMEOUTは、システムクロックに基づいて動作します。

実際の待機時間は、指定した秒数より若干長くなることがあります。

特に1秒の指定では、最大で約1秒のズレが生じる可能性があります。

代替手段との比較

TIMEOUTコマンド以外の待機方法も存在します。

PINGコマンドを使う方法

TIMEOUTが使えない古い環境では、PINGコマンドで代用できました。

ping -n 11 127.0.0.1 > nul

このコマンドで約10秒待機します。

仕組み:

  • ローカルループバックアドレス(127.0.0.1)にping
  • pingの間隔は1秒
  • -n 11で10回pingする(最初の1回は即座に返る)

デメリット:

  • 正確な秒数が指定しにくい
  • Ctrl+C以外で中断不可
  • TIMEOUTより複雑

現在ではTIMEOUTコマンドの使用を推奨します。

SLEEPコマンド

一部のResource KitにはSLEEPコマンドが含まれていました。

sleep 10

特徴:

  • シンプルな構文
  • キー入力で中断不可

問題点:

  • 標準では含まれていない
  • 別途インストールが必要
  • TIMEOUTで十分

現在の環境では不要です。

PowerShellのStart-Sleep

PowerShellを使用できる場合:

Start-Sleep -Seconds 10

メリット:

  • 小数点以下の秒数も指定可能
  • -Millisecondsでミリ秒指定も可能

デメリット:

  • バッチファイルから実行すると複雑
  • TIMEOUTで十分な場合が多い

バッチファイルからPowerShellを呼び出す例:

powershell -Command "Start-Sleep -Seconds 10"

特殊な要件がない限り、TIMEOUTで十分です。

実務での活用シーン

TIMEOUTコマンドが役立つ具体的な場面を紹介します。

サーバー再起動後の待機

@echo off
echo サーバーを再起動します...
shutdown /r /t 0 /m \\server01

echo 60秒待機(サーバー起動待ち)...
timeout /t 60 /nobreak

echo 接続テスト中...
ping -n 4 server01

サーバーが完全に起動するまで待機します。

ログファイルのローテーション

@echo off
echo ログファイルをアーカイブ中...
move C:\logs\app.log C:\logs\archive\app_%date:~0,10%.log

echo アプリケーションの再起動待機...
timeout /t 5 /nobreak

echo 新しいログファイルが作成されました
dir C:\logs\app.log

ログファイル操作後、アプリが新しいログを作成するまで待機します。

定期的なスクリーンショット取得

@echo off
setlocal

:capture_loop
set timestamp=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%
set timestamp=%timestamp: =0%

echo スクリーンショットを取得: screenshot_%timestamp%.png
nircmd savescreenshot "C:\screenshots\screenshot_%timestamp%.png"

echo 300秒待機(5分間隔)...
timeout /t 300 /nobreak > nul

goto capture_loop

5分ごとにスクリーンショットを自動取得します。

ネットワークドライブマッピングのリトライ

@echo off
set /a attempt=1
set /a max_attempts=5

:map_network_drive
echo ネットワークドライブ接続試行中... (試行 %attempt%/%max_attempts%)

net use Z: \\server\share /persistent:yes
if %errorlevel%==0 goto success

set /a attempt+=1
if %attempt% gtr %max_attempts% goto failed

echo 10秒後に再試行します...
timeout /t 10 /nobreak
goto map_network_drive

:success
echo ネットワークドライブの接続に成功しました
goto end

:failed
echo 接続失敗: 最大試行回数に達しました
echo ネットワーク管理者に連絡してください

:end
pause

ネットワークが不安定な環境で有効です。

よくある質問

Q1: TIMEOUTコマンドはWindows 10/11で使えますか?

はい、すべてのWindows 10/11で標準搭載されています。

コマンドプロンプトでもPowerShellでも使用できます。

追加のインストールは不要です。

Q2: 1秒未満の待機はできますか?

TIMEOUTコマンドでは1秒未満の指定はできません。

ミリ秒単位の待機が必要な場合は、PowerShellのStart-Sleepを使用してください:

Start-Sleep -Milliseconds 500

バッチファイルから呼び出す場合:

powershell -Command "Start-Sleep -Milliseconds 500"

Q3: バックグラウンドで実行したい

TIMEOUTコマンドは、基本的にフォアグラウンドで動作します。

バックグラウンドで実行するには、バッチファイル全体をバックグラウンドで起動します:

start /b timeout /t 10 /nobreak

または、タスクスケジューラを使用します。

Q4: キー入力を完全に無効化できますか?

/nobreakオプションを使えば、通常のキー入力は無視されます。

ただし、Ctrl+Cは常に有効です。

完全にキー入力を無効化することはできません。

Q5: カウントダウンを非表示にしつつ、完了メッセージは表示したい

メッセージを非表示にした後、自分でメッセージを表示します:

@echo off
echo 10秒待機中...
timeout /t 10 /nobreak > nul
echo 待機完了!

柔軟なメッセージ表示が可能です。

Q6: 複数のTIMEOUTコマンドを連続実行できますか?

はい、問題なく連続実行できます:

@echo off
echo 処理1
timeout /t 5 /nobreak > nul

echo 処理2
timeout /t 10 /nobreak > nul

echo 処理3
timeout /t 3 /nobreak > nul

echo すべて完了

各待機は独立して動作します。

Q7: タスクスケジューラから実行すると動きません

タスクスケジューラから実行する場合、/nobreakオプションが必須です。

さらに、メッセージを非表示にする必要があります:

timeout /t 10 /nobreak > nul

ユーザーがログインしていない環境では、これが確実です。

まとめ

TIMEOUTコマンドの要点をまとめます。

基本構文:

timeout /t 秒数 [/nobreak]

主なオプション:

  • /t 秒数: 待機する秒数(必須)
  • /nobreak: キー入力を無視
  • /t -1: 無期限待機

よく使うパターン:

  1. 基本的な待機:
timeout /t 10
  1. キー入力を無視:
timeout /t 10 /nobreak
  1. メッセージを非表示:
timeout /t 10 /nobreak > nul
  1. 無期限待機:
timeout /t -1

PAUSEコマンドとの使い分け:

  • 時間指定が必要 → TIMEOUT
  • シンプルに一時停止 → PAUSE
  • 自動再開が必要 → TIMEOUT
  • ユーザー確認が必須 → PAUSE

活用シーン:

  • バッチファイルでの処理間隔調整
  • アプリケーションの起動タイミング制御
  • サーバー再起動後の待機
  • エラー時のリトライ処理
  • 定期実行スクリプト
  • ログローテーション

注意点:

  • /Tオプションは必須
  • Windows Vista以降で使用可能
  • Ctrl+Cは常に有効
  • 1秒未満の指定は不可
  • システムクロックに依存

代替手段:

  • PAUSE: シンプルな一時停止
  • PING: 古い環境での代替
  • PowerShellのStart-Sleep: より精密な制御

TIMEOUTコマンドは、バッチファイル作成に欠かせない基本的なコマンドです。

この記事で紹介した使い方をマスターして、より効率的な自動化処理を実現してください。

実際のバッチファイルでは、TIMEOUTコマンドと他のコマンドを組み合わせることで、複雑な処理フローを構築できます。

ぜひ実践で活用してみてください。

コメント

タイトルとURLをコピーしました