Windowsのタスクスケジューラを使って、定期的にWinActorのシナリオを実行する場合があると思います。
複数のシナリオをタスクスケジューラで実行するとして、それぞれ独立した処理であれば影響はありませんが、複数シナリオ間で関係性があると、先行タスクの失敗に備えて後続タスクを抑止する必要があります。
今回は複数のシナリオをタスクスケジューラーで実行する場合の実装を考えてみます。
WinActor7からは複数シナリオを制御出来るみたいなので、WinActor6限定の内容となると思いますが、予めご了承ください。 [追記] WinActor 7では複数シナリオを開けるだけでした。複数実行は出来ません。
環境
以下の環境で確認しました。
- Windows 10 Pro (20H2)
- WinActor 6.3.1
前提条件
- シナリオ1(test_1.ums6)、シナリオ2(test_2.ums6)を実行する
- タスクスケジューラにタスクをそれぞれ登録する
- シナリオ2はシナリオ1が正常終了した後に実行する必要がある
- シナリオ起動用にvbsを用意する
ファイルの構成としては以下の図のような状態です。runscript配下に起動用のVBSが入っています。
この前提条件の場合に、シナリオ起動を抑止する必要がある状況を考えてみました。
先行シナリオ(シナリオ1) | 後続シナリオ(シナリオ2) | 実行抑止が必要な場所 | ||
状況1 | 待ち状態 | シナリオ1が途中で停止し、「待ち」の状態になっている状況 例)何かしらのダイアログが出ている。WinActorは起動したまま。 | シナリオ2用にタスク実行を行おうとするが、WinActorが複数のシナリオを同時実行出来ないため、シナリオ2は起動しない。 | タスク実行時 |
状況2 | 異常終了 | シナリオ1の実行中にエラーが発生したが、WinActorは終了した。シナリオは正常に処理出来ていない。 | シナリオ2は実行されるが、シナリオ1が正常終了していないため、期待した結果を得る事が出来ない。 | タスク実行時、または、シナリオ実行時 |
状況1ではタスクスケジューラに登録したタスクで実行を抑止する必要があり、状況2ではタスクまたはWinActor側で考慮する必要がありそうです。
起動ショートカットの作成
まず、タスクスケジューラ実行で必要な「起動ショートカット」を作成します。
WinActorのシナリオにて、[設定]-[起動ショートカット作成]を選択すると、タスクスケジューラで実行できるvbsファイルが作成出来ます。「WinActor タスクスケジューラ」で検索すると方法がヒットしますので、詳細は割愛します。
以下のようなファイルが作成されました。シナリオ1、シナリオ2、双方で作成しました。
WINACTOR_PATH="""<winactorのパス>\WinActor.exe"""
WINACTOR_OPT="-f ""<シナリオのパス>\test_1.ums6"" -r -e"
Set objShell = WScript.CreateObject("WScript.Shell")
Set objExec = objShell.Exec(WINACTOR_PATH & " " & WINACTOR_OPT)
token
状況1ではWinActorを実行する前に抑止する必要がありました。
シナリオが実行中、または、エラーで終了したかどうかをチェックするために、token という空ファイルを利用してみます。シナリオ内で、起動後にtokenを作成し、正常終了後にtokenを削除する処理になります。
tokenのチェックを入れた起動ファイルは以下のようにしてみました。
WINACTOR_PATH="""<winactorのパス>\WinActor.exe"""
WINACTOR_OPT="-f ""<シナリオのパス>\test_1.ums6"" -r -e"
'Set objShell = WScript.CreateObject("WScript.Shell")
'Set objExec = objShell.Exec(WINACTOR_PATH & " " & WINACTOR_OPT)
'tokenが存在するかチェック
Set objFso = CreateObject("Scripting.FileSystemObject")
ret = objFso.FileExists("<シナリオのパス>\token")
'メッセージボックス表示
If ret = True Then
MyVar = MsgBox ("token file found", 16, "scinario1")
Else
Set objShell = WScript.CreateObject("WScript.Shell")
Set objExec = objShell.Exec(WINACTOR_PATH & " " & WINACTOR_OPT)
End If
シナリオ1、シナリオ2用のVBSファイルをそれぞれ修正しました。メッセージ(MsgBox)は適当です。このVBSにする事で、tokenファイルが存在する場合は、WinActorを起動しない。という処理が実現できます。
シナリオ1、2にtoken処理を入れる
状況1、状況2に対処するため、シナリオにtoken関連の処理を入れます
まずは全体の流れをどうぞ。
右側の「先行タスク終了チェック」にて、tokenの存在確認を行い、存在しない場合は”実行中を示すための”tokenファイル作成します。tokenが既に存在する場合はエラーにしています。
左側の「実行アクション」内に本来行う処理を入れます。正常終了時にtokenファイルを削除しています。
「実行アクション」内でエラーが発生した場合、異常系でWinActorを終了させます。これでtokenファイルが存在する状況になります。
tokenと状況の関係
tokenと状況をまとめると以下のようになります。
token | 状況 |
ない | シナリオ実行可能 |
ある | 他のシナリオが実行中、または、先行するシナリオがエラーで終了した |
各アクションの内容
全体の流れのそれぞれのアクションの内容を貼り付けておきます。
まとめ
tokenの仕組みを入れる事で、状況1、状況2に備える事が出来そうです。また、シナリオ実行時はtokenファイルが存在するため、同時実行の抑止も出来るという内容となりました。
他の実装もあると思いますので、いろいろと試してみてください。