WinActor シナリオを順次実行する(エラー処理追加した活性炭版)


順次実行とは何？などは　[前回を参照](https://qiita.com/yuucc/items/05132068377102bc0a2b)
なお不完全燃焼版はエラー処理が無く複数のシナリオ実行に向いていない

##不完全燃焼版との違い
エラー処理っぽいのを追加しました。
batを書くのが死ぬほど面倒だったのでvbsで作成しました。

##エラー処理が無いとは？


```bat:不完全燃焼版メインシナリオ.bat
"C:\Program Files (x86)\WinActor\WinActor.exe" -f "C:\シナリオ\シナリオ1.ums5" -r -e
"C:\Program Files (x86)\WinActor\WinActor.exe" -f "C:\シナリオ\シナリオ2.ums5" -r -e
"C:\Program Files (x86)\WinActor\WinActor.exe" -f "C:\シナリオ\シナリオ3.ums5" -r -e
```
このbatには致命的な問題があります。
各シナリオでエラーが発生した際に、本来必要な処理が行われずに次のシナリオが実施されてしまう点です。

例えば
・シナリオ1でファイルを作成
・シナリオ2でファイルをコピー
・シナリオ3でコピー先のファイルを圧縮

という処理を自動で実行させたい場合、ファイル作成に失敗したら普通はシナリオ2,3は実施すべきではありません。
でも不完全燃焼版は気にせず実行してしまいます。

ファイルが無いのでどうせエラーになるとは思いますが、
無を取得して実行した結果、世界を崩壊させてしまうかもしれません。
エラー制御されていないというのは本当に恐ろしいことです。
何が起こるかわからないわけですから・・・

##どうやってエラーが発生したら止まるようにするか？
どうにかして止める必要があります。
関数のように呼べれば返り血という手も考えられますが・・・
WinActor.exeの血の色が何色なのかわかりません。
またエラー発生時、血の色を変える方法がわかりません。

よって独自のエラー処理を作ることにします。

##エラー処理仕様

|仕様No|  内容 |
|:-----|:------|
|1|シナリオファイルの置き場所にエラーが分かるファイルを設置する。|
|2|エラーが分かるファイルの名前はシナリオ名に".lock"という拡張子を付けたものとします。|
|3|シナリオ名.lockが残っていれば自動実行は中断させます|
|4|シナリオ名.lockは各シナリオで作成することにします。|
|5|正常系の最後にシナリオ名.lockを削除することにします。|
|6|異常が発生したらlockファイルの中に異常内容を書いても良いことにします。|

##各シナリオに追加する処理
各シナリオに追加する処理の概要は以下になります。赤色の部分がエラー制御用の処理です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/f7738675-3796-8016-0822-5a78c6a1ba83.png)

当初はエラー発生時にエラーファイルを作成しようと考えましたが、
割と予期せずハンドリングしていないエラーが発生して止まることもあったので・・・

シナリオの先頭でlockファイルを作成
→　正常系の最後に削除する
により正常系であることが担保出来ました。

なお、仕様No6がいらない場合、異常系の時に何かやる必要はないです。

###追加仕様の作り方
以下を組み合わせればできるはず

####シナリオ.lockファイルのパス取得
シナリオファイルを起点にして適当なファイルパスを作成するライブラリがあるのでこれを使ってlockファイルのパスを作成する。
・ライブラリ　
 →　NTTAT_v5.3.0　
 →　13_ファイル関連　
 →　05_ファイル名　
 → シナリオフォルダのファイルパス.ums5

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/3cc2797d-fa2b-be3a-9431-56632cd13be1.png)

これでlockファイルのファイルパスが完成



####シナリオ.lockの作成　及び　シナリオ.lockファイルに書込
・ライブラリ　
 →　NTTAT_v5.3.0　
 →　13_ファイル関連　
 →　01_テキストファイル操作　
 → テキストファイル書込.ums5
にlockファイルのファイルパスと何か一言を添える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/98dcec64-97c5-9756-6faf-3fc9204dd87c.png)


###シナリオ.lock削除
・ライブラリ　
 →　NTTAT_v5.3.0　
 →　13_ファイル関連　
 →　02_ファイル操作　
 → ファイル削除.ums5
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345260/b95c6eb9-4797-7b64-8790-30c8146cef33.png)

##自動実行スクリプトサンプル
以下のvbsをシナリオファイルの場所に置いて実行する。

```vbs:メインシナリオ.vbs
Option Explicit

dim winactorDir
dim scenarioDir
dim fso

set fso = createObject("Scripting.FileSystemObject")
winactorDir = """C:\Program Files (x86)\WinActor\WinActor.exe"""
scenarioDir = fso.getParentFolderName(WScript.ScriptFullName)

'シナリオ実行
call RunScenario(winactorDir, scenarioDir, "シナリオ1")
call RunScenario(winactorDir, scenarioDir, "シナリオ2")
call RunScenario(winactorDir, scenarioDir, "シナリオ3")

set fso = nothing

Sub RunScenario(winactorDir, scenarioDir ,scenarioName)
	dim fso
	dim objWShell

	dim scenarioPath
	dim scenarioLockPath
	dim exeArg
	
	set fso = createObject("Scripting.FileSystemObject")
	set objWShell = CreateObject("WScript.Shell")

    scenarioPath = fso.BuildPath(scenarioDir, scenarioName & ".ums5")
    scenarioLockPath = fso.BuildPath(scenarioDir, scenarioName & ".lock")

    exeArg = winactorDir & " -f """ &  scenarioPath  & """ -r -e"
    objWShell.Run exeArg , 0, true
    
    If fso.FileExists(scenarioLockPath) Then
    	WScript.echo scenarioName & "でエラーが発生したため終了します。"
	    WScript.Quit -1
	End If
    
    set fso = nothing
    set objWShell = nothing
    
End Sub 
```

**2019/06/07　追記**
なお、設定ファイル化を行っていた場合、
lockファイルパスが設定ファイルにあると面倒なことになるのでその列は削除すること
→　最初からシナリオを作ったらlockファイルパスが消えて変数のスコープか何かと勘違いしましたが空の設定が原因でした。
　

##反省点
後から入れるのも面倒なので先に考えておけばよかった。
batファイルを作る気力がなくなってしまったのでvbsにしてしまった。
**2019/06/07　追記**　シナリオファイルの変数をあまり考慮してなかった。

##備考
シナリオCallを待ち望んでいるが、
新しく出るWinActor Ver.6.0は画像認識向上とレコーダーのChrome対応らしい。
お金出しているのでもっと頑張って成長してくれることを期待。