Windowsコマンドプロンプトで「timeout」を使用してスクリプトの一時停止を行う方法

Windowsのコマンドプロンプトで「timeout」コマンドを使用してスクリプトの実行を一時停止する方法を解説します。システム管理者やプログラマーにとって、スクリプトの一時停止は非常に有用なテクニックです。この記事では、基本的な使い方から応用例、演習問題までを含め、実践的な知識を提供します。

目次

「timeout」コマンドの基本使用方法

「timeout」コマンドは、指定した時間だけスクリプトの実行を一時停止するためのシンプルなツールです。使い方は非常に簡単で、次のように使用します。

基本構文

timeout /t 秒数 /nobreak

「/t」は待機する秒数を指定し、「/nobreak」を追加することで、ユーザーがキーを押しても待機を中断しないようにします。

使用例

例えば、5秒間スクリプトを一時停止する場合、次のように入力します。

timeout /t 5 /nobreak

このコマンドを実行すると、5秒間の待機後に次のコマンドが実行されます。

効果

「timeout」コマンドを使用することで、スクリプトの実行を一時的に止めることができます。これにより、特定の処理が完了するのを待つための時間を設けたり、一定間隔で実行するタスクを設定したりすることが可能です。

スクリプト内での「timeout」コマンドの活用

スクリプトの中で「timeout」コマンドを効果的に利用することで、特定の処理間に待機時間を設けたり、リソースを節約したりすることができます。ここでは、具体的な活用方法をいくつか紹介します。

定期的な処理の実行

「timeout」コマンドを使用して、特定の間隔で繰り返し処理を実行するスクリプトを作成できます。例えば、10秒ごとにディスクの使用状況をチェックするスクリプトは次のようになります。

:loop
echo %date% %time% >> disk_usage.log
wmic logicaldisk get size,freespace,caption >> disk_usage.log
timeout /t 10 /nobreak
goto loop

このスクリプトは、10秒ごとにディスクの使用状況をログファイルに記録し続けます。

外部プロセスの完了待機

外部プロセスが完了するまで待機する必要がある場合、「timeout」を使用して待機時間を設定できます。以下の例では、バックアッププロセスが完了するまで5秒待機するようにしています。

start backup.exe
timeout /t 5 /nobreak
echo Backup process completed.

このスクリプトは、バックアッププロセスを開始し、5秒待機してからメッセージを表示します。

APIリクエストの間隔を調整

APIリクエストを送信するスクリプトでは、リクエスト間に待機時間を設けることでサーバーへの負荷を軽減できます。以下は、2秒ごとにAPIリクエストを送信する例です。

for /L %%i in (1,1,5) do (
    curl -X GET "https://api.example.com/data"
    timeout /t 2 /nobreak
)

このスクリプトは、5回のAPIリクエストを2秒間隔で送信します。

スクリプト内で「timeout」を適切に活用することで、さまざまなタスクの実行タイミングを柔軟に調整できます。

「timeout」と「sleep」の違い

Windowsのコマンドプロンプトでスクリプトを一時停止するために使われる「timeout」と「sleep」コマンドは似ていますが、それぞれに特有の特徴と利点があります。ここでは、この二つのコマンドの違いを比較し、どちらを選ぶべきかを解説します。

「timeout」コマンド

「timeout」コマンドは、指定した時間だけスクリプトを一時停止します。基本的な構文は次の通りです。

timeout /t 秒数 /nobreak

特徴

  • キーボード入力で中断可能(/nobreakオプションがない場合)
  • Windows環境で標準的に使用可能
  • 待機時間を秒単位で指定

「sleep」コマンド

「sleep」コマンドは、WindowsリソースキットまたはWindows Subsystem for Linux (WSL) で利用できるコマンドです。基本的な構文は次の通りです。

sleep 秒数

特徴

  • キーボード入力で中断不可
  • WindowsリソースキットやWSLのインストールが必要
  • 待機時間を秒単位または分単位で指定可能

比較表

特徴timeoutsleep
中断方法キーボード入力で中断可能中断不可
標準搭載はいいいえ(追加インストールが必要)
時間の単位秒、分
簡単な構文はいはい

どちらを選ぶべきか

  • 標準環境で簡単に使いたい場合: 「timeout」コマンドが適しています。特に追加のインストールなしで使用でき、簡単にスクリプトに組み込めます。
  • 長時間の待機が必要な場合: 「sleep」コマンドが便利です。時間を秒だけでなく分単位でも指定できるため、長時間の待機が容易です。

「timeout」と「sleep」の違いを理解し、適切なコマンドを選択することで、スクリプトの実行を効率的に制御することができます。

応用例:条件付きでの一時停止

「timeout」コマンドを条件付きで使用することで、スクリプトの実行を柔軟に制御できます。ここでは、特定の条件に基づいて一時停止する方法を具体的に紹介します。

条件付き一時停止の基本

スクリプト内で条件分岐を使用して、「timeout」コマンドを適用します。例えば、特定のファイルが存在する場合に一時停止するように設定できます。

使用例:ファイル存在チェック

指定されたファイルが存在するかどうかをチェックし、存在する場合に10秒間一時停止するスクリプトの例です。

if exist "C:\example\file.txt" (
    echo File exists. Pausing for 10 seconds.
    timeout /t 10 /nobreak
) else (
    echo File does not exist. Continuing execution.
)

このスクリプトは、C:\example\file.txt が存在する場合に10秒間一時停止し、存在しない場合は即座に次の処理に進みます。

ループ内での条件付き一時停止

ループ処理の中で特定の条件が満たされた場合にのみ一時停止を行うことができます。例えば、カウンタ変数が特定の値に達したときに一時停止する例です。

@echo off
set count=0
:loop
set /a count+=1
echo Current count: %count%
if %count%==5 (
    echo Count reached 5. Pausing for 5 seconds.
    timeout /t 5 /nobreak
)
if %count%==10 goto end
goto loop
:end
echo Loop has ended.

このスクリプトは、カウンタが5に達したときに5秒間一時停止し、10に達するとループを終了します。

応用例:ネットワーク接続の確認

ネットワーク接続が確立されているかどうかを確認し、接続が確立されるまで待機するスクリプトの例です。

@echo off
:check_connection
ping -n 1 www.google.com >nul 2>&1
if errorlevel 1 (
    echo No network connection. Retrying in 10 seconds.
    timeout /t 10 /nobreak
    goto check_connection
) else (
    echo Network connection established.
)

このスクリプトは、ネットワーク接続が確立されるまで10秒ごとに接続をチェックし続けます。

「timeout」コマンドを条件付きで使用することで、スクリプトの動作をより細かく制御でき、様々な状況に対応することが可能になります。

「timeout」コマンドを用いたエラーハンドリング

エラーハンドリングに「timeout」コマンドを使用することで、エラー発生時の待機や再試行のタイミングを制御できます。これにより、スクリプトの堅牢性を向上させることができます。ここでは、具体的なエラーハンドリングの方法を解説します。

基本的なエラーハンドリング

スクリプトが特定のコマンドを実行し、エラーが発生した場合に「timeout」を用いて再試行する方法を紹介します。

使用例:ファイルコピーのエラーハンドリング

ファイルコピーが失敗した場合、10秒間待機して再試行するスクリプトの例です。

@echo off
set max_retries=5
set retry_count=0

:copy_file
copy C:\source\file.txt C:\destination\file.txt
if errorlevel 1 (
    echo Error occurred during file copy. Retrying in 10 seconds.
    set /a retry_count+=1
    if %retry_count% geq %max_retries% (
        echo Maximum retries reached. Exiting.
        goto end
    )
    timeout /t 10 /nobreak
    goto copy_file
) else (
    echo File copy succeeded.
)
:end

このスクリプトは、ファイルコピーが失敗した場合に10秒間待機して再試行し、最大5回まで試行します。5回失敗すると、エラーメッセージを表示して終了します。

ネットワークエラーのハンドリング

ネットワーク接続のエラーハンドリングに「timeout」を使用することで、一定時間待機してから再試行することができます。

使用例:APIリクエストのエラーハンドリング

APIリクエストが失敗した場合、15秒間待機して再試行するスクリプトの例です。

@echo off
set max_retries=3
set retry_count=0

:make_request
curl -X GET "https://api.example.com/data" -o output.json
if errorlevel 1 (
    echo Error occurred during API request. Retrying in 15 seconds.
    set /a retry_count+=1
    if %retry_count% geq %max_retries% (
        echo Maximum retries reached. Exiting.
        goto end
    )
    timeout /t 15 /nobreak
    goto make_request
) else (
    echo API request succeeded.
)
:end

このスクリプトは、APIリクエストが失敗した場合に15秒間待機して再試行し、最大3回まで試行します。3回失敗すると、エラーメッセージを表示して終了します。

ディスクスペース不足のハンドリング

ディスクスペース不足の場合に、一定時間待機して再試行するスクリプトの例です。

使用例:ディスクスペースチェック

@echo off
set max_retries=5
set retry_count=0

:check_space
for /f "tokens=3" %%a in ('dir C:\ ^| find "bytes free"') do set free_space=%%a
if %free_space% lss 1000000000 (
    echo Insufficient disk space. Retrying in 20 seconds.
    set /a retry_count+=1
    if %retry_count% geq %max_retries% (
        echo Maximum retries reached. Exiting.
        goto end
    )
    timeout /t 20 /nobreak
    goto check_space
) else (
    echo Sufficient disk space available.
)
:end

このスクリプトは、ディスクスペースが1GB未満の場合に20秒間待機して再試行し、最大5回まで試行します。5回失敗すると、エラーメッセージを表示して終了します。

「timeout」コマンドをエラーハンドリングに活用することで、スクリプトの信頼性と耐障害性を高めることができます。

実際のスクリプト例

ここでは、「timeout」コマンドを用いた具体的なスクリプト例を紹介します。これらのスクリプトは、実際のシナリオでどのように「timeout」を利用できるかを示しています。

バックアップスクリプト

このスクリプトは、重要なファイルをバックアップし、その間に10秒間の待機時間を設けます。

@echo off
set source=C:\important_files
set destination=D:\backup\important_files
set timestamp=%date:~-4,4%%date:~-10,2%%date:~-7,2%_%time:~0,2%%time:~3,2%%time:~6,2%
set backup_folder=%destination%\backup_%timestamp%

echo Creating backup folder %backup_folder%
mkdir %backup_folder%

echo Copying files from %source% to %backup_folder%
xcopy %source% %backup_folder% /E /H /C /I

echo Waiting for 10 seconds before verification...
timeout /t 10 /nobreak

echo Verifying backup...
for /R %backup_folder% %%f in (*) do (
    fc %%f %source%\%%~nxf
    if errorlevel 1 (
        echo Verification failed for %%f
    ) else (
        echo Verification succeeded for %%f
    )
)
echo Backup and verification complete.

このスクリプトは、指定したディレクトリ内のファイルをバックアップし、バックアップ後に10秒間待機してからファイルの検証を行います。

サーバーヘルスチェック

次のスクリプトは、指定したサーバーのヘルスチェックを行い、失敗した場合に5秒間待機して再試行します。

@echo off
set server=192.168.1.1
set max_retries=3
set retry_count=0

:check_server
ping -n 1 %server% >nul 2>&1
if errorlevel 1 (
    echo Server %server% is not reachable. Retrying in 5 seconds...
    set /a retry_count+=1
    if %retry_count% geq %max_retries% (
        echo Maximum retries reached. Server is not reachable.
        goto end
    )
    timeout /t 5 /nobreak
    goto check_server
) else (
    echo Server %server% is reachable.
)
:end

このスクリプトは、サーバーへのpingを3回まで試み、失敗するたびに5秒間待機します。3回失敗すると、サーバーが到達不能であることを報告して終了します。

定期データ収集スクリプト

次のスクリプトは、10秒ごとにデータを収集し、指定したファイルにログを記録します。

@echo off
set logfile=C:\logs\data_collection.log

:collect_data
echo Collecting data at %date% %time% >> %logfile%
systeminfo | findstr /C:"Total Physical Memory" >> %logfile%

echo Waiting for 10 seconds before next collection...
timeout /t 10 /nobreak
goto collect_data

このスクリプトは、10秒ごとにシステムの物理メモリ情報を収集し、ログファイルに記録します。

これらのスクリプト例を参考にして、「timeout」コマンドをさまざまな用途で効果的に活用する方法を学びましょう。

演習問題

「timeout」コマンドの使用方法を練習するために、以下の演習問題を提供します。これらの問題に取り組むことで、スクリプトの作成と「timeout」コマンドの実用的な応用をより深く理解することができます。

演習1: ファイルの定期監視

指定したディレクトリ内のファイルを監視し、新しいファイルが追加された場合にそのファイル名を表示するスクリプトを作成してください。監視は10秒ごとに行い、新しいファイルが見つかるたびに再度監視を続けるようにします。

@echo off
set directory=C:\watched_folder
set last_count=0

:watch_directory
set current_count=0
for %%f in (%directory%\*) do set /a current_count+=1

if %current_count% gtr %last_count% (
    echo New file detected in %directory%
    dir %directory% /b
    set last_count=%current_count%
)

timeout /t 10 /nobreak
goto watch_directory

このスクリプトを完成させて、新しいファイルが追加された場合にそのファイル名を表示するようにしてください。

演習2: サービスの再起動

特定のWindowsサービスが停止している場合、そのサービスを再起動し、再起動が成功するまで5秒間隔で再試行するスクリプトを作成してください。最大3回まで再試行し、それでも失敗する場合はエラーメッセージを表示して終了します。

@echo off
set service_name=YourServiceName
set max_retries=3
set retry_count=0

:check_service
sc query %service_name% | find "RUNNING" >nul
if errorlevel 1 (
    echo Service %service_name% is not running. Attempting to start...
    sc start %service_name%
    if errorlevel 1 (
        echo Failed to start service. Retrying in 5 seconds...
        set /a retry_count+=1
        if %retry_count% geq %max_retries% (
            echo Maximum retries reached. Service could not be started.
            goto end
        )
        timeout /t 5 /nobreak
        goto check_service
    ) else (
        echo Service %service_name% started successfully.
    )
) else (
    echo Service %service_name% is already running.
)
:end

このスクリプトを完成させ、サービスの再起動と再試行を実装してください。

演習3: データベースバックアップ

データベースのバックアップを毎日深夜に実行し、バックアップ完了後にログを記録するスクリプトを作成してください。「timeout」を利用して24時間(86400秒)後に再度バックアップを行うように設定します。

@echo off
set logfile=C:\logs\db_backup.log

:backup_database
echo Starting database backup at %date% %time% >> %logfile%
REM 実際のバックアップコマンドをここに記述してください
echo Database backup completed at %date% %time% >> %logfile%

echo Waiting for 24 hours before next backup...
timeout /t 86400 /nobreak
goto backup_database

このスクリプトを完成させ、毎日バックアップが実行されるようにしてください。

これらの演習問題に取り組むことで、「timeout」コマンドの実用的な使用方法を習得し、スクリプトの作成スキルを向上させることができます。

まとめ

「timeout」コマンドは、Windowsのコマンドプロンプトでスクリプトの実行を一時停止するための非常に便利なツールです。基本的な使い方から始まり、条件付きでの一時停止やエラーハンドリングまで、多岐にわたる応用が可能です。この記事を通じて、「timeout」コマンドの基本構文や実際の使用例、そして演習問題を通じて、スクリプトの作成と管理に役立つ知識を身につけることができました。

スクリプトの柔軟性を高め、効率的にタスクを管理するために、「timeout」コマンドを積極的に活用してみてください。正しく使いこなすことで、スクリプトの信頼性とパフォーマンスが向上し、より効果的なシステム管理が実現できるでしょう。

コメント

コメントする

目次