PPxスクリプト中で外部プログラムを起動するには%Oを
使うのが一般的かと思うのだが、%Osを使うと
外部プログラムが終了するまでPPc等の操作ができない。
これを嫌ってWScript.Shellのrunメソッドを使っていたのだが
長時間(20時間くらい)プログラム終了待ちをしていると
変な戻り値が返ってきてプログラム終了をちゃんと判断できないことがある。
ガベージコレクションがかかってオブジェクトが破棄されるのだろうか?・・・
じゃ試しにWScript.Shellのexecメソッドを使ってみるかと
思ったのが今回の始まり。
runメソッドと違いexecメソッドではプログラムの終了を
自分で監視しなければならない。
google検索してよく出てくる凡例だとこんな感じ
var WSHObj = new ActiveXObject('WScript.Shell'); var execObj = ''; var command = '起動したいプログラム'; ExecObj = WSHObj.exec(command); while (ExecObj.Status == 0) { // 処理終了監視 WScript.Sleep(1000); }
ところがPaper Plane xUI Script ModuleではWScript.Sleepが使えない。
じゃPPx.Sleepはどうかというと全体が止まってしまうのか
動作に支障が出る。
なんか他の手は無いかといろいろと検索して見つけたのが
WScript.Sleepを発行するスクリプトを別に用意するという方法。
cscriptでそのスクリプトを実行する。
メインスクリプト
var WSHObj = new ActiveXObject('WScript.Shell'); var execObj = ''; var command = '起動したいプログラム'; var SleepVBS = 'cscript ' + PPx.Extract('%0%\\') + 'script\\sleep.vbs ' + '500'; // 500ミリ秒 ExecObj = WSHObj.exec(command); while (ExecObj.Status == 0) { // 処理終了監視 WSHObj.Run(SleepVBS,0,true); }
Sleep.vbs ※引数を使うのでvbsを使用
Option Explicit main() Sub main() Dim args Set args = WScript.Arguments If args.Count <= 0 Then WScript.Echo "時間が指定されていません" Exit Sub End If WScript.Sleep(args(0)) End Sub
これで上述の問題が解決すれば良いんだけど・・・