背景
以下のようなバッチを開発することになった。
- 日次バッチ: 1日1回6時30分のタイミングで動くバッチ
- 10分毎バッチ:10分毎に動くバッチ
さらに、以下条件が加わる。
- 日次バッチと10分毎バッチを並列で動かしてはいけない
- 日次バッチを6時30分に動かして何時に終わるかは不明
- 日次バッチが動いている間、10分毎バッチは動かしてはいけない
- 日次バッチを動かしたすぐ後に10分毎バッチを動かす必要がある
タスクスケジューラに日次実行と10分毎実行でバッチ登録した場合、上記の条件を満たすことはできない。
条件を満たすために設定した情報をまとめる。
目次
各種設定にて、設定値の解説を記載している。
各種設定
全ての設定については、後述でまとめる。
ここでは、条件を満たすための設定についてのみ記載する。
タスクスケジューラ
日次バッチ
トリガー
操作
設定
インスタンスについて
- 新しいインスタンスを開始しない
- 実行中のタスクがある場合、新しいタスクは開始しない。
- 新しいインスタンスを並列で実行
- 実行中のタスクがある場合でも新しいタスクを並列で実行する。
- 新しいインスタンスをキューに追加
- 実行中のタスクが終了するまで、次の新しいタスクは実行せずキューに溜まる。
- 実行中のタスクが終了した後、キューに溜まった次のタスクを実行する。
- 既存のインスタンスの停止
- 実行中のタスクがある状態で新しいタスクの実行時間がきた場合、実行中のタスクを強制終了し、新しいタスクを実行する。
10分毎バッチ
トリガー
- 毎日10分毎に実行するよう設定する。
- 日次バッチと同タイミングで起動しないよう6時40分からの開始とする。
- 日次バッチの10分前に終わるよう「繰り返し間隔」の「継続時間」に1420分間を設定する。
操作
設定
共通バッチファイル
共通バッチファイル.bat
@echo off
call :main %* 4>>%0
goto :eof
:main
if %1 == 0 (
@rem 6時30分毎実行
call C:\実行ファイル\日次実行バッチ.exe
call C:\実行ファイル\10分毎実行バッチ.exe
) else if %1 == 1 (
@rem 10分毎実行
call C:\実行ファイル\10分毎実行バッチ.exe
)
- 「%1」に操作の「引数の追加」で設定した値が設定される。
- 日次バッチの場合 :0
- 10分毎バッチの場合:1
- 「call」でバッチファイルを動かすことで日次バッチの終了後、すぐに10分毎バッチが動くように制御している。
callとstartについて
- call
- 呼び出したバッチファイルの終了を待って処理を行う。
- 並列処理が不可能
- start
- 呼び出したバッチファイルの終了を待たずに処理を行う。
- 並列処理が可能
- 以下を記載することで日次バッチが起動している場合、10分毎バッチは起動することができない。
- 共通バッチファイルを日次バッチ、10分毎バッチで同時に開かないよう制御している。
call :main %* 4>>%0
goto :eof
:main
最終的に
- タスクスケジューラーに日次バッチと10分毎バッチを登録し、共通バッチファイルを作ることで以下の条件を満たすことが可能になった。
- 日次バッチと10分毎バッチを並列で動かしてはいけない
- 日次バッチは6時30分に動かしてどの程度で終わるか不明
- 日次バッチが動いている間、10分毎バッチは動かしてはいけない
- 日次バッチを動かしたすぐ後に10分毎バッチを動かす必要がある
- タスクスケジューラーの「操作」の「引数の追加」に値を設定することで、該当のタスクスケジューラー起動時に設定した値が呼出したファイルに渡されることが分かった。
- 1つのファイルを日次バッチ、10分毎バッチで呼び出すことで並列処理しないよう制御できることが分かった。
全ての設定値
- 全ての設定値について記載する。