vbscriptでコマンドラインインタフェースを操作したい
vbscriptで、コマンドラインインタフェースのアプリケーション(以下「アプリ」)を操作するスクリプトを書いています。
この「アプリ」は、既存で存在する製品です。
操作したいアプリケーションに対しては、「接続先」、「ID」、「PASS」をこの順番にプロンプトで入力していき、
ID/PASSが合っていれば、認証が通り、OKを文字として返す、というような仕様です。
今書いているコードは、以下のような内容です。
当該アプリをExecメソッドで実行し、StdIn.Writelineでvbスクリプトから当該アプリに対し入力を与えています。
set sobj = CreateObject("WScript.Shell")
set objExec = 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」として解釈されてしまい、
コマンドを終了させるという意図した動作をしてくれません。
何かお知恵を拝借したく、投稿させて頂きます。
皆様、何卒よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/04/15 01:13
2017/04/15 01:20