1.vbsと2.vbsで生成する2つを素材として3.vbsが合体させるというa.vbsを組んだのですが

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を開始するにはどのようなプログラムを組めばいいのでしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/09/07 14:07:39
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:dawakaki No.4

回答回数797ベストアンサー獲得回数122

ポイント60pt

VBSにはスレッドの概念がないので、1.vbsと2.vbsを同時に走らせて、終わったタイミングを知るという手段が用意されていません。
ご質問にあるように1→2→3の順で処理していくのが素直なやり方です。

ご質問のような処理をしたいなら、VBに乗り換えるべきです。

その他の回答4件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ポイント60pt

前の回答と同様で それぞれ フラグとなるファイルを作成して
それぞれが 消えるまで ループして待つようにすればいいでしょう。

id:taknt

ファイルの読み書きが 実行速度の足を引っ張るという意見がありますが、
それぞれ プログラムに対してそれぞれ1回しか行わないので ぜんぜん足を引っ張ることはありません。

また監視続けるのも 非効率といいますが、動作を監視するのだから
当然の処理です。

そもそも非効率とか効率より、使えるプログラムを作成すればいいだけのことかと思います。

どっちにしろ何かの条件で監視しないと できないことだと思いますけどね。

2013/09/03 17:50:30
id:windofjuly No.2

回答回数2625ベストアンサー獲得回数1149

ポイント60pt

VBScriptはマルチスレッドに対応してません。

ファイルの読み書きはプログラム実行速度の足を引っ張りますし、
さらにそれを監視し続けるという方法はあまりにも非効率的です。

1.vbsと2.vbsの改善が無理で、どうしてもということであれば、
環境依存となりますがWin32APIを使う方法を検討しても良いでしょう。
下記「8 Shell関数の同期化のための方法 」が参考になるでしょう。
http://www.timberlandchapel.com/wsh.html

他2件のコメントを見る
id:dawakaki

他より良回答であれば多くのポイントを得られるのは当然ことですが、それを「意地汚く」と言うのはいかがなものでしょうか。

2013/09/03 20:13:30
id:windofjuly

攻撃したつもりが逆に返されてコメントを消したりする行動も含めて、
だわかきくんの普段の行動から悪意あるコメントだと感じたので意地汚くという言葉を入れただけですよ

2013/09/03 20:30:19
id:a-kuma3 No.3

回答回数4969ベストアンサー獲得回数2152

ポイント60pt

ぼくも、ウェイトがかからないループをぶんぶん回して終了を待ち合わせる、というのは拒否反応を起こすタイプです。
んで、こんなことを考えてみました。

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 が二つのデータを使って処理をする、と。

id:dawakaki No.4

回答回数797ベストアンサー獲得回数122ここでベストアンサー

ポイント60pt

VBSにはスレッドの概念がないので、1.vbsと2.vbsを同時に走らせて、終わったタイミングを知るという手段が用意されていません。
ご質問にあるように1→2→3の順で処理していくのが素直なやり方です。

ご質問のような処理をしたいなら、VBに乗り換えるべきです。

id:TransFreeBSD No.5

回答回数668ベストアンサー獲得回数268

ポイント60pt

なぜか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さんのがシンプルになりそうですが :->

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません