質問: sobj.Exec(アプリのパス) objExec.StdIn.Writeline(「接続先」) objExec.StdIn.Writeline(「ID」) objExec.StdIn.Writeline(「PASS」) Wscript.Sleep(5000) objExec.Terminate() --- 一番最後にTeminate()を実行しているのは、この後、この処理の実行結果の出力を、 StdOut.AtEndOfStreamを利用して、出力結果の内容を最後までの一連でチェックする処理が続くのですが、 AtEndOfStreamとなる為には、呼び出したプログラムが終了していないとAtEndOfStreamとならないと 私が考えているために、止む無く入れています。 さらにその前に、Wscript.Sleepを入れているのは、ID/PASSの認証処理が行われている最中にアプリを Terminateしてしまうと、認証処理が「途中」の状態のStdOutになってしまう為、 結果を正しく判定できないので、これも止む無く入れています。 この状態でもある程度は動くのですが、認証する際にネットワーク通信を利用しておりまして、 通信状況によっては上記の5000msのスリープでも足りずに、結果を正しく補足できない場合があります。 Sleepを長くすればいいのは理解できるのですが、そうすると、ネットワーク通信に問題がなく、 アプリが即座に結果を返してくれるような状況でも、長く設定したSleep分だけ待たなくてはいけないので、 あまり長くはしたくないと考えています。 「接続先」「ID」「PASS」を入れたあと、「なんらかの文字が出力され」、さらにその後に「文字の出力が止まった」後、起動したアプリを終了させる、ような方法は無いでしょうか。つまり、最後の「PASS」を入れたあと、「再度入力待ちになったタイミング」にてアプリを終了させる、ような方法はありませんでしょうか。 スリープしたあとにTerminateする、しか方法はないでしょうか。 このアプリは「quit」というコマンドがあり、このコマンドでアプリ自体を停止できます。 ので、「PASS」の入力の後に「quit」を入れる、というのも試みてみたのですが、 ID/PASSが間違っていた場合、再びID入力待ちになってしまうのがこのアプリの仕様でして、 IDの入力待ちになっているタイミングでの「quit」コマンド入力は、IDが「quit」として解釈されてしまい、 コマンドを終了させるという意図した動作をしてくれません。 何かお知恵を拝借したく、投稿させて頂きます。 皆様、何卒よろしくお願いいたします。
回答: VBScript-外部コマンドを実行する run の代わりに exec を使うと標準出力が利用できるそうです。 追記 よく読むと既に exec を使ってらっしゃるようで、トンチンカンな回答でした。 でしたら、対話的に入出力できるはずなので、強制終了させずに対話してみてください。