- ベストアンサー
JScriptで実行される関数の問題:二度目の実行で一度目の結果が残ってしまう
- JScriptで作成した関数に問題があります。二度目の実行時に、一度目の結果が残ってしまいます。
- 関数内で、標準出力を取得するために使用しているoExec.StdOut.ReadAll()が問題の原因です。
- 一度目の実行時に追加した文字列が二度目の実行時にも残ってしまうため、問題が発生しています。対症療法としては、oExec.terminate()の前にoExec.StdOut.Clear()を実行することで、一度目の結果をクリアすることができます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは 下記のHTAをWindows8.1とWindows XP sp3で動作させましたが仰られるような現象は発生せず正常に表示されます。mecabの標準出力を一度に読み取る場合も、一行ずつ読み取る場合も問題ありません。 mecabはインストール時にsjisを選択しました。 ご提示いただいた場所とは別の部分に問題があるのではないでしょうか? ------------------------------------------------------------------- <html> <head> <title>mecab.exe テスト</title> <script type="text/jscript"> // mecab.exeのパスは適宜書き換え var cmd = "C:\\bin\\mecab\\bin\\mecab.exe"; var arg1 = "瑞西に住む友人の家では" var arg2 = "或日語学の教師の老婦人が" function exe_mecab(arg){ var wsh = new ActiveXObject("WScript.Shell"); var oExec = wsh.Exec(cmd); //mecab標準入力に文字列を与える oExec.StdIn.Write(arg); oExec.StdIn.Close(); var str = ''; //mecab標準出力を1行ずつ読み取り //var line; //while (!oExec.StdOut.AtEndOfStream) { // line = oExec.StdOut.ReadLine(); // if(line != "EOS"){ // str = str + line + "<br>"; // } //} //mecab標準出力を全て一度に読み取り str = oExec.StdOut.ReadAll(); //結果表示 document.getElementById("result_area").innerHTML=str; } function exeApp1(){ exe_mecab(arg1) } function exeApp2(){ exe_mecab(arg2) } </script> </head> <body> <form name="confirm"> <input type="button" value="確認1" onclick="exeApp1()"> <input type="button" value="確認2" onclick="exeApp2()"> </form> <div id="result_area">結果表示</div> </body> </html>
その他の回答 (1)
- XenoneX
- ベストアンサー率85% (12/14)
2度目のarg="FOOBAR"であるように動作するというのは、 結果から推測される値でしょうか? それともデバッグをして、argの中身を実際に確認したのでしょうか?
お礼
質問を投稿後、ネット上のVBSサンプルを参照して次のコードを作ったのですが、やはり結果は同じでした。 もしかすると、操作する命令に依存するかもしれません。特に隠す必要もないので今回は公開します。それはmecab.exeという日本語文章を文法的な単位に分解するプログラムです。 Function ExecMecab(jp) Dim oShell Set oShell = CreateObject("WScript.Shell") Set oExec = oShell.Exec("mecab.exe") oExec.StdIn.Write jp & vbCrLf dim retval retval = "" Do While oExec.StdOut.AtEndOfStream = False l = oExec.StdOut.ReadLine if l = "EOS" then exit do retval = retval & l & vbCrLf Loop ' oExec.StdIn.Close ' oExec.StdOut.Close oExec.Terminate() ExecMecab = retval set oShell = nothing set oExec = nothing End Function ExceMecab("瑞西に住む友人の家では") を実行すると"瑞西に住む友人の家では"が分解された結果が得られます。次に ExceMecab("或日語学の教師の老婦人が") を実行すると"瑞西に住む友人の家では或日語学の教師の老婦人が")が分解された結果が得られてしまいます。どうやら、前回oExec.StdIn.WriteでMecabの標準入力に書き込んだ内容が積み重なっているようです。 もちろん、ExecMecab()内でMsgBox jpしその内容が期待通りであることは確認済みです。 もしかしてStdIn.Close、StdOut.Closeする必要があるかと思い、実行したのですが変化なかったです。 なお、無関係かと思いますが、この関数はHTA内で実行しています。
お礼
返答ありがとうございます ご提示のコードで、当方でも当該問題が発生しませんでした。 これから原因を探索します。 今後もおねがいします