- 作成者投稿
- 2009年2月9日 4:02 am #7060kshi参加者
簡単な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());2009年2月9日 8:19 pm #7069Yutaka 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());2009年2月10日 3:16 am #7071kshi参加者江村さん、ご回答ありがとうございます。
見事に動きました!標準出力を得ることができれば、
アウトプットバーに出力するもよし、
文書に書き込むもよし、
外部ツールとの連携が自在にできますね。2009年3月15日 8:57 am #7239kshi参加者どうも 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()); - 作成者投稿
- このトピックに返信するにはログインしてください。