この記事では、.bat(バッチファイル)で「特定の処理が終わるまで待つ」という方法について紹介しています。
主なコマンドは以下の2つです。
for /l %%i in (開始値、増分、終了値) do コマンド
timeout /t 秒数
今回はサンプルとして次の2つの処理を待つバッチファイルを書いてみたいと思います。
・目的のファイルが作成されるのを待つ方法
・特定のプログラム(プロセス)が終了するのを待つ方法
個別に紹介します。
Sample Code
基本となるタイマー処理(最大10秒間待つ)
@echo off
set count=0
set TIME_OUT=10
for /l %%i in (1,1,%TIME_OUT%) do (
rem ここで何らかの処理
echo %%i
set count=%%i
timeout /t 1 > nul
)
基本となる処理です。先頭の@echo offはコマンドの表示をオフにするものです。
まず、2つの変数(count、TIME_OUT)にそれぞれ値を代入しています。
そして、上で紹介しているfor文でループさせます。今回の例では、%%iが1~10(TIME_OUT)まで変化します。
%%iの値をcountに代入しているのは変数のスコープが関係しています。%%iはfor文の中でしかスコープを保てないため、countに代入してfor文の外でも「何回ループしたのか」分かるようにしています。
そして最後にtimeoutコマンドで待機時間を指定しています。結果をnulにリダイレクトしているのは「〇秒間待っています」という表示を出力しないようにするためです。
ちなみにバッチファイルを実行するこんな感じで表示されます。
目的のファイルが作成されるのを待つ方法
@echo off
set count=0
set TIME_OUT=10
for /l %%i in (1,1,%TIME_OUT%) do (
if exist sample.txt (
echo ファイル確認
goto END
)
echo %%i
set count=%%i
timeout /t 1 > nul
)
rem タイムアウト時の処理
echo ファイル未作成
:END
例として、”sample.txt”というファイルが存在すれば(作成されれば)goto文でループを抜けるように作成しています。
もし、ファイルが指定した時間以内に作成されない場合は「タイムアウト時の処理」の部分にエラー処理を記述すれば良いでしょう。
3秒後に目的のファイルが作成された場合はこんな処理になります。
特定のプログラム(プロセス)が終了するのを待つ方法
@echo off
set count=0
set TIME_OUT=10
setlocal enabledelayedexpansion
for /l %%i in (1,1,%TIME_OUT%) do (
tasklist | find "notepad.exe" > nul
if !ERRORLEVEL! == 0 (
echo プロセス実行中
) else (
echo プロセス終了
goto END
)
echo %%i
set count=%%i
timeout /t 1 > nul
)
endlocal
rem プロセスが時間以内に終了しなかった場合の処理
echo タイムアウト
:END
今回の例では分かりやすいようにメモ帳(notepad.exe)が終了するまで待つという処理にしました。
この処理を実行するためには「遅延環境変数」を使う必要があります。
構文としてはこんな感じです。
setlocal enabledelayedexpansion ーー 遅延環境変数を使う処理をここに書く ーー !<変数>! endlocal
ポイントは変数を%で囲むのではなく、!で囲む必要があることです。
この遅延環境変数を使用しないと「ERRORLEVEL」の値がfor文の中で変更されなくなってしまいます。(※for文開始時の値から変化しなくなります。)
詳しく知りたい方は「環境遅延変数」で検索してみてください!
また、使用している環境変数「ERRORLEVEL」について簡単に説明しておきます。この「ERRORLEVEL」には、直前で実行したコマンドが成功なら0、失敗なら1というエラーコードが入っています。
そのため、tasklist | find “notepad.exe” の結果、メモ帳が起動していれば0、起動していなければ1という値に変化します。今回はその結果をif文で判定しています。
例として、メモ帳が3秒間で終了した場合のバッチファイル実行結果は下のようになります。
以上です。
参考になればうれしいです。
コメント