- 締切済み
Windows7のタスクスケジューラで
Windows7のタスクスケジューラで 並列で動いている2つのタスク(.batや.vbs)が両方とも完了したら次のタスクが動くような仕組みはできますか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- chachaboxx
- ベストアンサー率23% (412/1777)
終了イベントの捉え方ですが、 捉えるタスクの種類で変わります。 1.コマンドライン(含むバッチ)型 ➡上位バッチを作成し収容するかたちでインタープリタで処理を進める。 タスクDの中からタスクAとタスクBを実行し、双方終了次第、タスクCを実行する。 2.WinbowsEXEファイル型 ➡タスク終了を監視する。 実行中タスクのProcessIDを調べるソフトを常駐させ、そのソフトからタスクCを実行する。 3.ファイル走査型 ➡定期的にファイルスタンプを比較する。 共有ファイルなどが対象で、編集ソフトやユーザーが特定できない場合、保存されたファイル属性を 調べる処理をタスクDとして定期的に実行し、その中からタスクCを呼び出す。 等々ありますが、そもそも、処理待ちタスクが全てVBで書けるような内容であれば、まとめて1つにするのが1番制御しやすいですね、 あとは、タスクCが同日に二回以上実行されないようなチェックルーチンを設けておくことでしょうか。 タスクの実行完了検出やファイル比較バッチなど いろんなサンプルがネットで公開されてます。 処理目的をシンプルに確定し、上手に組み合わせ 少しでも楽できるようがんばって下さい。
- notnot
- ベストアンサー率47% (4900/10359)
平行にするのがダウンロードと言うことなので、そもそも平行にせず、直列にすれば、全部1処理で出来ます。 LAN-I/Fが1つでディスクが1つの状態で2つ同時に大きいファイルをダウンロードするとネット帯域とディスクを取り合って、速くなりません。 一応、バッチコマンドでWAITFORという他の処理を待つコマンドがあるので、2つ終わったら動き出すという処理は作れます。 <待つ側バッチ>・・・・あらかじめ起動しておく waitfor foo waitfor foo 以下処理を書く <起動する側バッチ1> 処理1 waitfor /si foo <起動する側バッチ2> 処理2 waitfor /si foo vbsだとwaitforをrunしてください。
お礼
ありがとうございます。 ダウンロードは、手動で行っていた時は2~3つ並行させた方が終了時刻が早かったので、並行処理を考えていました。 waitforを調べてみます
- chachaboxx
- ベストアンサー率23% (412/1777)
補足コメントからの回答です。 日次の定期ジョブであれば、同様にタスクスケジューラーがいいのではないでしょうか? その中で、データがアップロードされていないことを条件分岐する感じです。 ※アップロードファイルの存在orタイムスタンプ etc. 最も簡単なのは、前処理が確実に終わっていると思われる時刻に 希望する処理を実行することです。(笑) サーバーデータの更新が自動処理である限り、更新の失敗を対策する方が 効果的に処理を進められると思います。 ※極端な話、更新の後処理が数時間(夜間)で終わらないようなケースでは、 更新を1日ずらして実行する必要があります。 具体的なスクリプトコマンドなどは、ググってみてください。
補足
> 日次の定期ジョブであれば、同様にタスクスケジューラーがいいのではないでしょうか? > その中で、データがアップロードされていないことを条件分岐する感じです。 ここがよくわからなかったのですが、 並列で動いてるタスクAとタスクBが両方完了したらタスクCを起動する場合、 データがアップロードされていないことを条件分岐するのはAやBですか? ダウンロードする前にチェックして、アップロードされてなければAやBの処理を止めるのでしょうか?その場合はタスクCは起動はするけどデータがないため何もせず終了となる感じでしょうか。 > 最も簡単なのは、前処理が確実に終わっていると思われる時刻に 希望する処理を実行することです。(笑) なるほど笑 今回はこの方式になる可能性が高いです。 > サーバーデータの更新が自動処理である限り、更新の失敗を対策する方が 効果的に処理を進められると思います。 同感です。しかしサーバへのアップロードは人手で行われており(別システム)、この業務は今回はこのままとさせてください。 後学のために、前タスクの終了イベントを捉えるやり方をご教授願えませんか? よろしくお願いします。
- chachaboxx
- ベストアンサー率23% (412/1777)
できますが、目的により方法も変わります。 前タスクの終了後、直ちに起動する必要があれば 前タスクの終了イベントを捉えることになりますし、 そんなに慌てないのであれば、定期的(数秒ごと)に プロセスの存在を確認すればいいとなります。 他、スクリプトでいくのかプログラム組むのかも。
お礼
回答ありがとうございます。 補足に情報を記載しました。 よろしくお願いします。
補足
直ちに起動しなくても良いですが、数分以内に起動して欲しいです。 ただし、この一連の処理が動くのは1日数回だけです。 背景を補足いたしますと、毎日夜間にサーバからデータをダウンロードして処理するのですが、 サーバにデータがまだアップロードされてない場合は、しばらく時間(30分~1時間)を置いて再チャレンジします。 “並列で動く2つの前タスク”はダウンロード処理です。 > スクリプトでいくのかプログラム組むのか スクリプトを考えてましたが特に制約はありません。 メリット・デメリットを比較して決めたいと思います。 以上、よろしくお願いします。
お礼
何度も回答頂きありがとうございます。 丁寧な説明、とても助かります。 教えて頂いたことを調べて頑張ってみます。