1 件の投稿を表示中 (合計 4 個)
  • 作成者
    投稿
  • #7060
    kshi
    参加者

    簡単なDOSコマンドくらい気軽に実行したいと思って、
    以下のようなマクロを書いてみました。

    ファイルがすこし多目のフォルダをdirで表示しようとすると、
    DOS窓を表示したまま固まってしまいます。
    マウスでウィンドウを閉じる(×)と、アウトプットバーにちゃんと書き込まれます。

    Sleep(100)で待機しているあたりに
    もう一工夫いるのでしょうか。

    #title = “DOSコマンド実行”
    #tooltip = “DOSコマンドを実行し、結果をアウトプットバーに出力します。”

    var sCmd
    if ((sCmd = prompt(“input command:”, “”)) == “”) { QUit(); }
    var wsh = new ActiveXObject(“WScript.Shell”);
    wExec = wsh.Exec(“%ComSpec% /c ” + sCmd);
    while (wExec.Status == 0) {
    Sleep(100);
    }
    OutputBar.Visible = true;
    OutputBar.SetFocus();
    var t = new Array(80); OutputBar.writeln(t.join(“-“)); //区切り線
    OutputBar.write(wExec.StdOut.ReadAll());
    OutputBar.write(wExec.StdErr.ReadAll());

    #7069
    Yutaka Emura
    キーマスター

    kshiさんは書きました:
    簡単なDOSコマンドくらい気軽に実行したいと思って、
    以下のようなマクロを書いてみました。

    ファイルがすこし多目のフォルダをdirで表示しようとすると、
    DOS窓を表示したまま固まってしまいます。
    マウスでウィンドウを閉じる(×)と、アウトプットバーにちゃんと書き込まれます。

    Sleep(100)で待機しているあたりに
    もう一工夫いるのでしょうか。

    #title = “DOSコマンド実行”
    #tooltip = “DOSコマンドを実行し、結果をアウトプットバーに出力します。”

    var sCmd
    if ((sCmd = prompt(“input command:”, “”)) == “”) { QUit(); }
    var wsh = new ActiveXObject(“WScript.Shell”);
    wExec = wsh.Exec(“%ComSpec% /c ” + sCmd);
    while (wExec.Status == 0) {
    Sleep(100);
    }
    OutputBar.Visible = true;
    OutputBar.SetFocus();
    var t = new Array(80); OutputBar.writeln(t.join(“-“)); //区切り線
    OutputBar.write(wExec.StdOut.ReadAll());
    OutputBar.write(wExec.StdErr.ReadAll());

    面白いですね。ループの中でも、StdOut をフラッシュしないといけないようですね。次のように変えてみるとうまくいくようです。

    #title = “DOSコマンド実行”
    #tooltip = “DOSコマンドを実行し、結果をアウトプットバーに出力します。”

    var sCmd
    if ((sCmd = prompt(“input command:”, “”)) == “”) { QUit(); }
    var wsh = new ActiveXObject(“WScript.Shell”);
    wExec = wsh.Exec(“%ComSpec% /c ” + sCmd + “n”);
    OutputBar.Visible = true;
    var t = new Array(80); OutputBar.writeln(t.join(“-“)); //区切り線
    while (wExec.Status == 0) {
    Sleep(100);
    OutputBar.write(wExec.StdOut.ReadAll());
    }
    OutputBar.SetFocus();
    OutputBar.write(wExec.StdOut.ReadAll());
    OutputBar.write(wExec.StdErr.ReadAll());

    #7071
    kshi
    参加者

    江村さん、ご回答ありがとうございます。
    見事に動きました!

    標準出力を得ることができれば、
    アウトプットバーに出力するもよし、
    文書に書き込むもよし、
    外部ツールとの連携が自在にできますね。

    #7239
    kshi
    参加者

    どうも WshScriptExec オブジェクトの仕様を勘違いしていたようです。WSHのサンプルコードでCALC.EXE(非同期なプログラム)を起動して、その終了を待つ例があったので真似したのですが、コマンドラインツールの標準出力を得るにはwhileループで待機する必要はなく、StdOutプロパティを1回参照すればよいようです。

    WSHにお詳しい方、いかがでしょうか?

    #title = “DOSコマンド実行”
    #tooltip = “DOSコマンドを実行し、結果をアウトプットバーに出力します。”

    var sCmd
    if ((sCmd = prompt(“input command:”, “”)) == “”) { Quit(); }
    var wsh = new ActiveXObject(“WScript.Shell”);
    wExec = wsh.Exec(“%ComSpec% /c ” + sCmd + “n”);

    OutputBar.Visible = true;
    OutputBar.SetFocus();
    OutputBar.writeln(“——–“);
    OutputBar.write(wExec.StdOut.ReadAll());
    OutputBar.write(wExec.StdErr.ReadAll());

1 件の投稿を表示中 (合計 4 個)
  • このトピックに返信するにはログインしてください。