1日1回実行のバッチと10分間実行のバッチを同時実行しないようにする方法

# 背景
以下のようなバッチを開発することになった。
- 日次バッチ：　1日1回6時30分のタイミングで動くバッチ
- 10分毎バッチ：10分毎に動くバッチ

さらに、以下条件が加わる。
- 日次バッチと10分毎バッチを並列で動かしてはいけない
- 日次バッチを6時30分に動かして何時に終わるかは不明
- 日次バッチが動いている間、10分毎バッチは動かしてはいけない
- 日次バッチを動かしたすぐ後に10分毎バッチを動かす必要がある

タスクスケジューラに日次実行と10分毎実行でバッチ登録した場合、上記の条件を満たすことはできない。
条件を満たすために設定した情報をまとめる。

# 目次
各種設定にて、設定値の解説を記載している。
- [各種設定](#各種設定)
    - [タスクスケジューラ](#タスクスケジューラ)
        - [日次バッチ](#日次バッチ)
            - [トリガー](#トリガー)
            - [操作](#操作)
            - [設定](#設定)
        - [10分毎バッチ](#10分毎バッチ)
            - [トリガー](#トリガー-1)
            - [操作](#操作-1)
            - [設定](#設定-1)
    - [共通バッチファイル](#共通バッチファイル)
    - [最終的に](#最終的に)
- [全ての設定値](#全ての設定値)
    - [タスクスケジューラ](#タスクスケジューラ-1)
        - [日次バッチ](#日次バッチ-1)
            - [全般](#全般)
            - [トリガー](#トリガー-2)
            - [操作](#操作-2)
            - [条件](#条件)
            - [設定](#設定-2)
        - [10分毎バッチ](#10分毎バッチ-1)
            - [全般](#全般-1)
            - [トリガー](#トリガー-3)
            - [操作](#操作-3)
            - [条件](#条件-1)
            - [設定](#設定-3)
- [参考資料](#参考資料)

# 各種設定
全ての設定については、後述でまとめる。
ここでは、条件を満たすための設定についてのみ記載する。

## タスクスケジューラ
### 日次バッチ
#### トリガー
- 毎日6時30分に実行するよう設定する。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/4c1c2561-c656-77d0-c4db-da64fbb00c2e.png" width="80%">

#### 操作
- 「設定」の「プログラム/スクリプト」については、10分毎バッチでも同じバッチファイルを呼び出す。
- 「引数の追加」に「0」（任意の数値）を設定する。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/edbada78-4eac-bc44-b420-0f8485480d32.png" width="80%">

#### 設定
- 「新しいインスタンスをキューに追加」を選択する。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/a9f0a25a-02b3-8b29-c4ed-40b44cd62761.png" width="80%">

::: note info
インスタンスについて
- 新しいインスタンスを開始しない
    - 実行中のタスクがある場合、新しいタスクは開始しない。
- 新しいインスタンスを並列で実行
    - 実行中のタスクがある場合でも新しいタスクを並列で実行する。
- 新しいインスタンスをキューに追加
    - 実行中のタスクが終了するまで、次の新しいタスクは実行せずキューに溜まる。
    - 実行中のタスクが終了した後、キューに溜まった次のタスクを実行する。
- 既存のインスタンスの停止
    - 実行中のタスクがある状態で新しいタスクの実行時間がきた場合、実行中のタスクを強制終了し、新しいタスクを実行する。
:::

### 10分毎バッチ
#### トリガー
- 毎日10分毎に実行するよう設定する。
- 日次バッチと同タイミングで起動しないよう6時40分からの開始とする。
- 日次バッチの10分前に終わるよう「繰り返し間隔」の「継続時間」に1420分間を設定する。
  - 1420分間 = 23時間40分
  - 例えば9月9日の6時40分から10分毎バッチが起動した場合、9月10日の6時20分まで10分毎に実行される。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/e4ab1d26-125c-c28b-df47-6ed086f27f4c.png" width="80%">

#### 操作
- 「設定」の「プログラム/スクリプト」については、日次バッチと同じファイル名を設定する。
- 「引数の追加」に「1」（任意の数値※ただし日次バッチと被らない数値の必要がある）を設定する。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/b34bc052-c135-26fc-79fd-85336481d271.png" width="80%">

#### 設定
- 「新しいインスタンスを開始しない」を選択する。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/3c410431-99a7-dba6-9999-c002cd87a1e8.png" width="80%">

## 共通バッチファイル
- 操作の「プログラム/スクリプト」で設定したファイル
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/51dc01c8-5eeb-f1c2-08cc-bef1b5babd32.png" width="80%">

~~~ 共通バッチファイル.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分毎バッチが動くように制御している。

::: note info
callとstartについて
- call
    - 呼び出したバッチファイルの終了を待って処理を行う。
    - 並列処理が不可能
- start
    - 呼び出したバッチファイルの終了を待たずに処理を行う。
    - 並列処理が可能
:::

- 以下を記載することで日次バッチが起動している場合、10分毎バッチは起動することができない。
    - 共通バッチファイルを日次バッチ、10分毎バッチで同時に開かないよう制御している。 
~~~ bat
call :main %* 4>>%0
goto :eof
:main
~~~

## 最終的に
- タスクスケジューラーに日次バッチと10分毎バッチを登録し、共通バッチファイルを作ることで以下の条件を満たすことが可能になった。
    - 日次バッチと10分毎バッチを並列で動かしてはいけない
    - 日次バッチは6時30分に動かしてどの程度で終わるか不明
    - 日次バッチが動いている間、10分毎バッチは動かしてはいけない
    - 日次バッチを動かしたすぐ後に10分毎バッチを動かす必要がある
- タスクスケジューラーの「操作」の「引数の追加」に値を設定することで、該当のタスクスケジューラー起動時に設定した値が呼出したファイルに渡されることが分かった。
- 1つのファイルを日次バッチ、10分毎バッチで呼び出すことで並列処理しないよう制御できることが分かった。

# 全ての設定値
- 全ての設定値について記載する。

## タスクスケジューラ
### 日次バッチ
#### 全般
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/7315f82f-edc3-7474-596a-25568b9a872a.png)

#### トリガー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/b178908b-6c29-9c5d-5f0f-ceb7960716b0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/4d743bf3-64d3-f4b6-6d54-2bcc0cd2f93e.png)

#### 操作
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/761145f2-7148-dcd4-5a43-3a3bbbf1e8e4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/a02a2135-01fd-8d52-3bbf-394b5fc53ec2.png)

#### 条件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/14be898f-5ddb-37cc-7e20-f2d813272cc5.png)

#### 設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/a7777918-382f-8407-80fc-d957358981ba.png)

### 10分毎バッチ
#### 全般
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/47b0d457-d944-eaa8-3370-2f395e66f673.png)

#### トリガー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/a3091a85-f2d8-e42b-0a21-62ee49713a58.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/fdedcd99-0ff7-1a0f-0438-6a3f55615709.png)

#### 操作
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/7495c49a-eceb-1e6b-41c4-f10090b4baee.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/496c283e-e5a9-0c3a-1640-5d3213a055b9.png)

#### 条件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/a651b647-e505-8b50-0fb6-0ea1c527b022.png)

#### 設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2847634/e48b3f0d-cfff-d771-68bc-876592bb9217.png)

# 参考資料
- [タスクスケジューラの定期実行タスクが次回の実行時刻に実行されない場合の対処方法](https://cloud-si.com/taskschd-instance/)
- [Windowsのバッチファイルで同時実行させない方法](http://nm777gtx.blog.fc2.com/blog-entry-13.html)
- [batファイルで多重起動（二重起動）を防止する](https://aachyee.hatenablog.com/entry/2017/07/24/165716)
- [【業務自動化】タスクスケジューラを登録して定例作業を自動起動させよう](https://www.depthbomb.net/?p=1945#toc9)