【UiPath】ファイル変更トリガーをどうやって停止させるか...

## 皆もすなるQiitaといふものを、儂もしてみむとてするなり。

と言う訳で、こん＊＊は！はなっち！です。

【初めに】
前回、「トリガー スコープ」アクティビティの中に格納する、「ファイル変更トリガー」アクティビティを中心に記事を書きました。

https://qiita.com/HANACCHI/items/16ee2ba2a48b25e650ee

ファイルをどうした時に、どんな変更を検出し、トリガー発動されるか。

今回は、トリガー発動ではなく、トリガーが発動されたあと、「トリガー スコープ」アクティビティで、どう動く、そして、どうロボットを終了させていくかを書いていこうと思います。
- - -
## １）「トリガー スコープ」アクティビティのパラメタの設定
前回のフォルダ構成と同じ状態で、２つのテキストファイル、１つのEXCELファイルを、監視しているフォルダに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/3d715f85-a4b6-99c8-ee0e-d29df88edf1e.png)
このロジックで、「スケジューリング モード」を変えて実行してみます。

### 1-1「スケジューリング モード」＝「一回」
実行ログに、検出されたファイルの情報が吐かれています。
```
16:09:50.4946 Info {"message":"フォルダ監視トリガ の実行が開始されました。
16:09:58.3718 Trace {"message":"◆Start Monitoring◆
16:10:02.7509 Trace {"message":"Created
16:10:02.7621 Trace {"message":"FullName:c:\\users\\HogeHoge\\desktop\\検証\\ファイル監視トリガー\\新規 Microsoft Excel ワークシート.xlsx
16:10:02.7629 Trace {"message":"CreationTime:20230415160955
16:10:02.7632 Trace {"message":"LastWriteTime:20230415160958
16:10:02.7634 Trace {"message":"Length:8587
16:10:02.7637 Trace {"message":"IsReadOnly:False
16:10:02.7709 Info {"message":"フォルダ監視トリガ の実行が終了しました。
```
３つのファイルをコピーしたのに、１ファイルしか検出されませんでした。
ただし、検出した後に、ロボットは即終了しています。

### 1-2「スケジューリング モード」＝「順次」あるいは「同時」
実行ログに、検出されたファイルの情報が吐かれています。
```
16:25:58.7844 Info {"message":"フォルダ監視トリガ の実行が開始されました。
16:26:06.5367 Trace {"message":"◆Start Monitoring◆
16:26:11.7171 Trace {"message":"Created
16:26:11.7197 Trace {"message":"FullName:c:\\users\\HogeHoge\\desktop\\検証\\ファイル監視トリガー\\新規 Microsoft Excel ワークシート.xlsx
16:26:11.7201 Trace {"message":"CreationTime:20230415162603
16:26:11.7205 Trace {"message":"LastWriteTime:20230415162606
16:26:11.7209 Trace {"message":"Length:8585
16:26:11.7212 Trace {"message":"IsReadOnly:False
16:26:11.7235 Trace {"message":"Changed
16:26:11.7269 Trace {"message":"FullName:c:\\users\\HogeHoge\\desktop\\検証\\ファイル監視トリガー\\新規 Microsoft Excel ワークシート.xlsx
16:26:11.7273 Trace {"message":"CreationTime:20230415162603
16:26:11.7276 Trace {"message":"LastWriteTime:20230415162606
16:26:11.7278 Trace {"message":"Length:8585
16:26:11.7281 Trace {"message":"IsReadOnly:False
16:26:11.7302 Trace {"message":"Created
16:26:11.7341 Trace {"message":"FullName:c:\\users\\HogeHoge\\desktop\\検証\\ファイル監視トリガー\\新規 テキスト ドキュメント_New.txt
16:26:11.7345 Trace {"message":"CreationTime:20230415162600
16:26:11.7348 Trace {"message":"LastWriteTime:20230415162601
16:26:11.7351 Trace {"message":"Length:34
16:26:11.7382 Trace {"message":"IsReadOnly:False
16:26:11.7389 Trace {"message":"Changed
16:26:11.7418 Trace {"message":"FullName:c:\\users\\HogeHoge\\desktop\\検証\\ファイル監視トリガー\\新規 テキスト ドキュメント_New.txt
16:26:11.7424 Trace {"message":"CreationTime:20230415162600
16:26:11.7427 Trace {"message":"LastWriteTime:20230415162601
16:26:11.7429 Trace {"message":"Length:34
16:26:11.7432 Trace {"message":"IsReadOnly:False
16:26:13.5820 Trace {"message":"Deleted
16:26:13.5855 Trace {"message":"FullName:c:\\users\\HogeHoge\\desktop\\検証\\ファイル監視トリガー\\新規 テキスト ドキュメント.txt
16:26:13.5859 Trace {"message":"CreationTime:20230415162558
16:26:13.5862 Trace {"message":"LastWriteTime:20230415162600
16:26:13.5865 Trace {"message":"Length:27
16:26:13.5867 Trace {"message":"IsReadOnly:False
16:26:13.5875 Trace {"message":"Created
16:26:13.5898 Trace {"message":"FullName:c:\\users\\HogeHoge\\desktop\\検証\\ファイル監視トリガー\\新規 テキスト ドキュメント.txt
16:26:13.5901 Trace {"message":"CreationTime:20230415162558
16:26:13.5903 Trace {"message":"LastWriteTime:20230415162600
16:26:13.5906 Trace {"message":"Length:27
16:26:13.5909 Trace {"message":"IsReadOnly:False
16:26:13.5914 Trace {"message":"Changed
16:26:13.5942 Trace {"message":"FullName:c:\\users\\HogeHoge\\desktop\\検証\\ファイル監視トリガー\\新規 テキスト ドキュメント.txt
16:26:13.5946 Trace {"message":"CreationTime:20230415162558
16:26:13.5948 Trace {"message":"LastWriteTime:20230415162600
16:26:13.5950 Trace {"message":"Length:27
16:26:13.5960 Trace {"message":"IsReadOnly:False
16:26:31.7918 Trace {"message":"Created
16:26:31.7950 Trace {"message":"FullName:c:\\users\\HogeHoge\\desktop\\検証\\ファイル監視トリガー\\追加のファイル.txt
16:26:31.7955 Trace {"message":"CreationTime:20230415162621
16:26:31.7959 Trace {"message":"LastWriteTime:20230415162621
16:26:31.7961 Trace {"message":"Length:0
16:26:31.7964 Trace {"message":"IsReadOnly:False
16:27:50.9520 Info {"message":"フォルダ監視トリガ の実行が終了しました。
```
巨大なログになってしまったのは、ご容赦。
重要なのは、３つのファイルを移動して、一連のトリガー発動が終了した18秒後に監視しているフォルダに格納した新ファイル`追加のファイル.txt`が、ちゃんと検出されている、と言う点。
これは、「スケジューリング モード」＝「順次」あるいは「同時」の場合は、 **アクションを行った** （この場合は検出したファイルの各種情報をログ出力した） **のち、再び監視状態に戻るという事です。**
となると、 **ロボはずっと実行したままで、終了する事はありません** 。

UiPath Studioから起動しているので、タスクバーから終了させると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/24db43cf-30b7-8274-c4ca-7faf205fcca5.png)
ログにもあるように、終了する事が出来ました。

自動化、効率化を実行するロボットが、人の手を借りなければ終了できないと言うのは、本末転倒なお話ですね。

### 1-2「スケジューリング モード」＝「順次」あるいは「同時」どうするか（その１）
複数のトリガーが発動して、その回数分アクション側に制御が渡ってくる。その時に終了の条件を設定してあげて、終了条件を満たしたらロボを終了させてみましょう。
まず、終了させるための時刻(`LimitTimeSpan`)の設定です。ここでは **現在時刻に2分後に終了させる** よう、指定してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/aa829b20-3900-a5e1-ab68-bf517950e9c2.png)
`LimitTimeSpan = New TimeSpan(now.Hour, now.Minute, now.Second).Add(New Timespan(0,2,0))`

次に、現在時刻が、この終了させるための時刻(`LimitTimeSpan`)を超えたら終了させるように（「トリガー スコープ」アクティビティを終了させる）ようにします。これには、「繰り返しを終了」アクティビティを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/fd4979fe-6147-6314-ae6b-569a2308a272.png)
Condition：`(Now.TimeOfDay).CompareTo(LimitTimeSpan).Equals(1)`

全体的なロジックは以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/bebff180-3746-039f-50da-287eaf8e16a1.png)

これを実行した時のログです。
```
17:01:26.0560 Info {"message":"フォルダ監視トリガ の実行が開始されました。
17:01:33.7689 Trace {"message":"◆Start Monitoring◆
17:01:47.5350 Trace {"message":"Created
17:01:47.5378 Trace {"message":"Title:
17:01:47.5381 Trace {"message":"FullName:c:\\users\\HogeHoge\\desktop\\検証\\ファイル監視トリガー\\新規 Microsoft Excel ワークシート.xlsx
17:01:47.5385 Trace {"message":"CreationTime:20230415170130
17:01:47.5388 Trace {"message":"LastWriteTime:20230415170133
17:01:47.5390 Trace {"message":"Length:8587
17:01:47.5393 Trace {"message":"IsReadOnly:False
    Omission
17:01:49.3817 Trace {"message":"Changed
17:01:49.3844 Trace {"message":"Title:
17:01:49.3847 Trace {"message":"FullName:c:\\users\\HogeHoge\\desktop\\検証\\ファイル監視トリガー\\新規 テキスト ドキュメント.txt
17:01:49.3850 Trace {"message":"CreationTime:20230415170126
17:01:49.3853 Trace {"message":"LastWriteTime:20230415170127
17:01:49.3857 Trace {"message":"Length:27
17:01:49.3860 Trace {"message":"IsReadOnly:False
17:04:08.6826 Trace {"message":"Created
17:04:08.6855 Trace {"message":"Title:
17:04:08.6858 Trace {"message":"FullName:c:\\users\\HogeHoge\\desktop\\検証\\ファイル監視トリガー\\追加のファイル.txt
17:04:08.6965 Trace {"message":"CreationTime:20230415162621
17:04:08.6971 Trace {"message":"LastWriteTime:20230415162621
17:04:08.6974 Trace {"message":"Length:0
17:04:08.6976 Trace {"message":"IsReadOnly:False
17:04:08.7037 Info {"message":"フォルダ監視トリガ の実行が終了しました。
```

`17:01:33.7689`に終了させるための時刻(`LimitTimeSpan`)の設定し、
`17:03:33.7689`を超えたら終了する予定とします。

実際に実行させると、
`17:04:08.6826`にトリガーが発動され、「条件分岐」アクティビティに記載の条件に合致し、繰り返しを終了。
`17:04:08.7037`にロボが終了した事がわかります。

### 1-2「スケジューリング モード」＝「順次」あるいは「同時」どうするか（その２）
**トリガーが発動した時** に、終了させるための時刻(`LimitTimeSpan`)を超えていたら終了するのはいいのですが、 **トリガーが発動しなければ** 、終了させるための時刻を超えているかの判定は行えません。と言う事は、 **トリガーが発動しない時はロボは実行したまま** です。
こういった場合は、「並列」アクティビティを利用してみます。

終了させるための時刻(`LimitTimeSpan`)の設定は、前節と同じ。
「並列」アクティビティを配置し、その中に従来の「トリガー スコープ」アクティビティと、「繰り返し (後判定)」アクティビティを配置します。この時、「並列」アクティビティのパラメタ「条件」を`True`にします（「並列」アクティビティの中のアクティビティのうち、いずれか一つが終了すると、「並列」アクティビティが終了するモード）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/511d8f4b-56f7-7f9a-0762-7e0cb1623460.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/577e1bf3-54d4-48e2-9650-2698ad5c79c3.png)

左側に配した「トリガー スコープ」アクティビティの「アクション」にあった、時間条件は不要なので削除します・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/26fd100c-a0e4-2d2b-0b36-616e83c4a745.png)
右側に配した「繰り返し (後判定)」アクティビティの中に、「Delay」アクティビティを配し、更に条件に`(Now.TimeOfDay).CompareTo(LimitTimeSpan).Equals(-1)`を設定します。
これは、`今の時刻が、終了させるための時刻より小さい`の意味です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669015/56e9a76a-752d-0c98-1d54-cf0ecc01d1c0.png)
これを実行した時のログです。
```
17:50:47.1071 Info {"message":"フォルダ監視トリガ の実行が開始されました。
17:50:52.9587 Trace {"message":"◆Start Monitoring◆
17:52:43.1910 Trace {"message":"Created
17:52:43.1943 Trace {"message":"FullName:c:\\users\\HogeHoge\\desktop\\検証\\ファイル監視トリガー\\新規 Microsoft Excel ワークシート.xlsx
17:52:43.1947 Trace {"message":"CreationTime:20230416000051
17:52:43.1950 Trace {"message":"LastWriteTime:20230416000052
17:52:43.1954 Trace {"message":"Length:8589
17:52:43.1957 Trace {"message":"IsReadOnly:False
17:52:43.1978 Trace {"message":"Changed
17:52:43.2003 Trace {"message":"FullName:c:\\users\\HogeHoge\\desktop\\検証\\ファイル監視トリガー\\新規 Microsoft Excel ワークシート.xlsx
17:52:43.2007 Trace {"message":"CreationTime:20230416000051
17:52:43.2010 Trace {"message":"LastWriteTime:20230416000052
17:52:43.2012 Trace {"message":"Length:8589
17:52:43.2015 Trace {"message":"IsReadOnly:False
17:52:43.2022 Trace {"message":"Created
17:52:43.2078 Trace {"message":"FullName:c:\\users\\HogeHoge\\desktop\\検証\\ファイル監視トリガー\\新規 テキスト ドキュメント_New.txt
17:52:43.2083 Trace {"message":"CreationTime:20230416000048
17:52:43.2086 Trace {"message":"LastWriteTime:20230416000049
17:52:43.2089 Trace {"message":"Length:34
17:52:43.2091 Trace {"message":"IsReadOnly:False
17:52:43.2097 Trace {"message":"Changed
17:52:43.2121 Trace {"message":"FullName:c:\\users\\HogeHoge\\desktop\\検証\\ファイル監視トリガー\\新規 テキスト ドキュメント_New.txt
17:52:43.2125 Trace {"message":"CreationTime:20230416000048
17:52:43.2128 Trace {"message":"LastWriteTime:20230416000049
17:52:43.2130 Trace {"message":"Length:34
17:52:43.2133 Trace {"message":"IsReadOnly:False
17:52:44.5011 Trace {"message":"Deleted
17:52:44.5038 Trace {"message":"FullName:c:\\users\\HogeHoge\\desktop\\検証\\ファイル監視トリガー\\新規 テキスト ドキュメント.txt
17:52:44.5042 Trace {"message":"CreationTime:20230416000047
17:52:44.5045 Trace {"message":"LastWriteTime:20230416000048
17:52:44.5047 Trace {"message":"Length:27
17:52:44.5049 Trace {"message":"IsReadOnly:False
17:52:44.5056 Trace {"message":"Created
17:52:44.5079 Trace {"message":"FullName:c:\\users\\HogeHoge\\desktop\\検証\\ファイル監視トリガー\\新規 テキスト ドキュメント.txt
17:52:44.5082 Trace {"message":"CreationTime:20230416000047
17:52:44.5085 Trace {"message":"LastWriteTime:20230416000048
17:52:44.5087 Trace {"message":"Length:27
17:52:44.5089 Trace {"message":"IsReadOnly:False
17:52:44.5093 Trace {"message":"Changed
17:52:44.5113 Trace {"message":"FullName:c:\\users\\HogeHoge\\desktop\\検証\\ファイル監視トリガー\\新規 テキスト ドキュメント.txt
17:52:44.5117 Trace {"message":"CreationTime:20230416000047
17:52:44.5119 Trace {"message":"LastWriteTime:20230416000048
17:52:44.5122 Trace {"message":"Length:27
17:52:44.5124 Trace {"message":"IsReadOnly:False
17:52:53.0871 Info {"message":"フォルダ監視トリガ の実行が終了しました。
```
`17:50:52.9587`に終了させるための時刻(`LimitTimeSpan`)の設定し、
`17:52:52.0000`を超えたら終了する予定とします。

実際に実行させ、ファイルを移動すると、トリガーが発動されました。
`17:52:53.0871`に「繰り返し (後判定)」アクティビティの条件を満たさなくなったため、「繰り返し (後判定)」アクティビティが終了し、ロボが終了した事がわかります。

## 【まとめ】
**スケジューリング モード」＝「一回」の場合** 
* 業務の入力ファイルは期間単位に１つ生成され、それを入力にする業務である
* 格納される時間をおおよそ決めてあるので、それ以前に一度だけロボットを起動させればよい。

**「スケジューリング モード」＝「順次」または「同時」の場合**
* 業務の入力ファイルは期間単位に複数回生成され、それを入力にする業務である
* ずっと監視をし続けてしまうので、トリガー以外の、条件に応じて終了するアクティビティを、「並列」アクティビティ内に記述する。「並列」アクティビティの条件は`True`とする。
* トリガーが発動した場合に行われる後続業務処理で、 **使用したファイルを監視フォルダ外に移動、あるいは監視フォルダより削除する。** 移動あるいは削除しても、トリガーした情報は残っているので、`args.FileChangeInfo.FullPath`のファイルが実際に存在するかを判断する事で、 **重複処理を防ぐ事が出来る** 。

- - - 

##おわりに
いかがでした？

今回も読んでいただきありがとうございました！
是非UiPathでのロボ開発の一助になればと思っています。

ありがとうございました！