人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: takanii
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● きゃづみぃ
●60ポイント

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


きゃづみぃさんのコメント
ファイルの読み書きが 実行速度の足を引っ張るという意見がありますが、 それぞれ プログラムに対してそれぞれ1回しか行わないので ぜんぜん足を引っ張ることはありません。 また監視続けるのも 非効率といいますが、動作を監視するのだから 当然の処理です。 そもそも非効率とか効率より、使えるプログラムを作成すればいいだけのことかと思います。 どっちにしろ何かの条件で監視しないと できないことだと思いますけどね。

2 ● うぃんど
●60ポイント

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

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

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


うぃんどさんのコメント
ところで…、 いつになればガイドラインの注意事項に従っていただけるのでしょうか? 一週間放置で自動配分を繰り返されると、 ポイント目的でググっただけの低質な回答が増加し、さらには、 低質な回答と一緒にされるのが嫌になって回答しない人続出などとなり、 あなた自身もすでにかなりの損をしています。 忙しいのだとは思いますが、 あなた自身のためにも注意事項の遵守をお願いします。 また、無料質問につきましても自動終了まで放置したりせず、 返事を返すくらいの礼儀は持ってください。 返事を返すことで開けることも多々ありますから…。 以上よろしくお願いします。 http://q.hatena.ne.jp/help/guideline >> 有料で質問を行う場合、質問終了後、質問者は回答者に対して所定のはてなポイントを支払います。支払いの際には回答の内容によって支払うはてなポイントの額を変えることができますので、よい回答が得られた際には多めに支払い、不適切な回答には支払いを行わないなど、適切に回答の品質に対する評価を行ってください。 <<

うぃんどさんのコメント
だわかき(id:dawakaki)くん>他より多くのポイントを獲得したいという意図が見え隠れするコメント 私が意地汚くポイントを得ようとしていると閲覧者に思い込ませたいという意図が見え隠れしますね。 私のプロフィール(http://q.hatena.ne.jp/windofjuly/answerlist)を見ればポイント無しへの回答比率の高さがわかるはずですから無駄だと思いますよ。 あぁ、そうか…、ポイント均等配分をする人が減ったらポイント狙いで回答している人の分け前が減ると言いたいのかな…。 だわかきくんのプロフィール(http://q.hatena.ne.jp/dawakaki/)見るとポイント付き質問ばかりで均等配分されている率高いものねぇ…。 回答拒否されてると「知っているんですが…」とか言って拒否外させることもたくさんやってますねぇ。 実力あるんだから実力で勝負したらポイント稼げると思うんだけど、ちがうのかなぁ…。

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

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

3 ● a-kuma3
●60ポイント

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

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


4 ● だわかき
●60ポイント ベストアンサー

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

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


5 ● TransFreeBSD
●60ポイント

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

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ