a.vbs
=============================
dim wsh
Dim objFileSystemObject
Dim strFolderPath
set wsh = CreateObject( "WScript.Shell" )
Set objFileSystemObject = WScript.CreateObject("Scripting.FileSystemObject")
strFolderPath = objFileSystemObject.GetFolder(".").Path
wsh.CurrentDirectory = "C:\Users\Desktop"
wsh.Run "1.vbs",,true
wsh.CurrentDirectory = "C:\Users\Desktop"
wsh.Run "2.vbs",,true
wsh.CurrentDirectory = "C:\Users\Desktop"
wsh.Run "3.vbs",,true
=============================
この方法だと1→2→3の順で処理していくので大変時間がかかってしまいます
1と2を同時にスタートさせつつ 1と2の両方が終了した時点で3を開始するにはどのようなプログラムを組めばいいのでしょうか?
VBSにはスレッドの概念がないので、1.vbsと2.vbsを同時に走らせて、終わったタイミングを知るという手段が用意されていません。
ご質問にあるように1→2→3の順で処理していくのが素直なやり方です。
ご質問のような処理をしたいなら、VBに乗り換えるべきです。
VBScriptはマルチスレッドに対応してません。
ファイルの読み書きはプログラム実行速度の足を引っ張りますし、
さらにそれを監視し続けるという方法はあまりにも非効率的です。
1.vbsと2.vbsの改善が無理で、どうしてもということであれば、
環境依存となりますがWin32APIを使う方法を検討しても良いでしょう。
下記「8 Shell関数の同期化のための方法 」が参考になるでしょう。
http://www.timberlandchapel.com/wsh.html
他より良回答であれば多くのポイントを得られるのは当然ことですが、それを「意地汚く」と言うのはいかがなものでしょうか。
攻撃したつもりが逆に返されてコメントを消したりする行動も含めて、
だわかきくんの普段の行動から悪意あるコメントだと感じたので意地汚くという言葉を入れただけですよ
ぼくも、ウェイトがかからないループをぶんぶん回して終了を待ち合わせる、というのは拒否反応を起こすタイプです。
んで、こんなことを考えてみました。
3.vbs をちょっと工夫して、1.vbs と 2.vbs のスクリプトが作るデータが両方そろっていたら、目的の処理をするように書いておきます。
で、1.vbs と 3.vbs、2.vbs と 3.vbs を cmd.exe のパイプラインを使って順番に実行する、ということを、Exec メソッドで並列に行います。
ソースのイメージは、こんな感じ。
dim wsh set wsh = CreateObject("WScript.Shell") wsh.Exec("cmd.exe /c cscript 1.vbs & cscript 3.vbs") wsh.Exec("cmd.exe /c cscript 2.vbs & cscript 3.vbs")
先に終わった方の Exec では、3.vbs はデータがそろってないので処理を空振りし(というふうに、3.vbs を作っておく)、後に終わった方の 3.vbs が二つのデータを使って処理をする、と。
VBSにはスレッドの概念がないので、1.vbsと2.vbsを同時に走らせて、終わったタイミングを知るという手段が用意されていません。
ご質問にあるように1→2→3の順で処理していくのが素直なやり方です。
ご質問のような処理をしたいなら、VBに乗り換えるべきです。
なぜかvbs的にオーソドックスな回答が出てないので :-)
http://msdn.microsoft.com/en-us/library/ateytk4a.aspx
Execを使って終了を待ちます。Sleepの値は適当に。
Dim wsh, exec1, exec2 Set wsh = CreateObject( "WScript.Shell" ) wsh.CurrentDirectory = "C:\Users\Desktop" Set exec1 = wsh.exec("wscript 1.vbs") Set exec2 = wsh.exec("wscript 2.vbs") Do While exec1.Status = 0 Or exec2.Status = 0 WScript.Sleep 2000 Loop wsh.Run "3.vbs",,true
あと、ちょっと捻って子プロセスの標準出力が閉じられるまで待ってみました。
これだとループは少ないはず。
Dim wsh, exec1, exec2 Set wsh = CreateObject( "WScript.Shell" ) wsh.CurrentDirectory = "C:\Users\Desktop" Set exec1 = wsh.exec("wscript 1.vbs") Set exec2 = wsh.exec("wscript 2.vbs") exec1.StdOut.ReadAll exec2.StdOut.ReadAll Do While exec1.Status = 0 Or exec2.Status = 0 WScript.Sleep 100 Loop wsh.Run "3.vbs",,true
#まあ、3.vbsをいじれるならa-kuma3さんのがシンプルになりそうですが :->
ファイルの読み書きが 実行速度の足を引っ張るという意見がありますが、
2013/09/03 17:50:30それぞれ プログラムに対してそれぞれ1回しか行わないので ぜんぜん足を引っ張ることはありません。
また監視続けるのも 非効率といいますが、動作を監視するのだから
当然の処理です。
そもそも非効率とか効率より、使えるプログラムを作成すればいいだけのことかと思います。
どっちにしろ何かの条件で監視しないと できないことだと思いますけどね。