[マクロ] 標準出力の取得

  1. こんにちは。

    マクロを書いてみました。
    誰か幸せになる人がいることを祈って。

    取得のところでsleep関数やinterval関数を使ってみたかったのですが、使えるオブジェクトが判らずに断念しています。

    おかしなところを教えていただけると私が幸せに……。
    それでは。

    ----------
    // 編集中のRubyスクリプトを実行して、標準出力を取得する。

    var myscript = '"' + document.Path + document.Name + '"';
    var cmd = 'cmd /c cd /d "' + document.Path + '" & ruby ' + myscript ;

    // 編集中のRubyスクリプトを保存
    document.Save();

    // Rubyスクリプトを実行する
    var WshShell = new ActiveXObject("WScript.Shell")
    var oExec = WshShell.Exec(cmd);

    // 標準出力と標準エラー出力の取得
    var errstr = "";
    var stdstr = "";
    var tryCount = 0;
    var irregular = 0;
    while (tryCount < 256){
        tryCount ++; 
        // 標準出力を先に読み込まないと、標準出力がバッファを埋め尽くしている
        // 場合にダメ(StdErr.AtEndOfStreamがフリーズする)らしい。
        if (!oExec.StdOut.AtEndOfStream){stdstr += oExec.StdOut.ReadAll(); tryCount=0;};
        if (!oExec.StdErr.AtEndOfStream){errstr += oExec.StdErr.ReadAll(); tryCount=0;};
        if (oExec.Status == 0){tryCount=0;}
        irregular ++; if (irregular > 1000){Alert("終わらない!?"); break;}
        // if (oExec.Status == 1){break;}
    }

    // 取得した標準出力の内容を新規ファイルに出力
    if (stdstr.length > 0) {
        Editor.NewFile();
        Editor.Documents.Item(editor.Documents.Count-1).Write(stdstr);
    }

    // 取得した標準エラー出力の内容を新規ファイルに出力
    if (errstr.length > 0) {
        Editor.NewFile();
        Editor.Documents.Item(editor.Documents.Count-1).Write(errstr);
    }
    ----------

    Mery 2.0.10.3973
    Windows7 X64

     |  手石  |  返信
  2. こんにちは。

    こちらの方がすっきりしている。
    どちらがいいのだろう。
    ----------
    // 編集中のRubyスクリプトを実行する。
    // 標準出力と標準エラー出力をリダイレクトする。

    var tempFilePath = document.Path
    var myScript = '"' + document.Path + document.Name + '"';
    var stdout_log = "stdout.log";
    var cmd = 'cmd /c cd /d "' + tempFilePath + '" & ruby ' + myScript + ' >' + stdout_log + ' 2>&1';
    var WshShell = new ActiveXObject("WScript.Shell")

    // 編集中のRubyスクリプトを保存
    document.Save();

    // Rubyスクリプトを実行する
    WshShell.Run(cmd, 1, true);

    // リダイレクトされたファイルを開く
    Editor.NewFile();
    Editor.OpenFile(tempFilePath + stdout_log);

    ----------
    Mery 2.0.10.3973
    Windows7 X64

     |  手石  |  返信
  3. こんばんは。

    編集中のRubyスクリプトを実行して、標準出力を取得する。
    と書かれていたので、(自分の場合は)手石さんとは
    別な方法で試してみました。

    #---------------------------------------------------------
    #Rubyはバッチに書くことが出来る。
    #標準出力はファイルに変える事が出来る。
    #Meryはたとえば、batで書いたものでも、タスクバーで簡単に
    #Rubyの表示にできる。
    #「既定のプログラム」の実行は、Meryの外部ツールを利用。
    #
    #動作確認 windows7 64ビット ruby1.9.3
    #
    #---------------------------------------------------------

    1.下記をたとえば、test_script.batに書く。
      more +3なので、File.open("C:/JwTool/debug.txt", 'w'){|f|
      は、4行目にある必要がある。

    --- test_script.bat ----
    @echo off
    more +3 %0 | ruby -Ks
    goto:eof
    File.open("C:/JwTool/debug.txt", 'w'){|f|
      $stdout = f
      puts "Meryがすき・・・"
      puts "すきすきすき・・"
      $stdout = STDOUT
    }
    -------------------------
    2.幸いMeryは、タスクバーのBatのところをクリックして
      Rubyに簡単に変更できる。

    3.debug.txtもMeryで開いておく。

    4.test_script.batをMeryの「既定のプログラム」で実行させた後、
      debug.txtをアクティブにすると、Meryは、
      外部でファイルが変更されています。
      読み直しますか?
      とメッセージを出すので、「はい」を押す。
    -------------------------
    下記を参考にしました。
    詳細はそちらでご確認ください。

    1.初めてのRuby (Yugui著) p.91

    2.Lite & Seen Lite様
    http://www17.ocn.ne.jp/~lite/indexx.html
    の ばっち の 作法
    -------------------------
    1つの事を行うのに、それをかなえる方法は
    いろいろあるという事で...

     |  いっち  |  返信
  4. 訂正致します。

    > 2.幸いMeryは、タスクバーのBatのところをクリックして
    >   Rubyに簡単に変更できる。

    「ステータスバー」の誤りです。

     |  いっち  |  返信
  5. 初めてのRuby p.93を読み返していたら
    標準出力だけでなくて、標準エラー出力も出来る気がしました。

    @echo off
    more +3 %0 | ruby -Ks
    goto:eof
    File.open("C:/JwTool/debug.txt", 'w'){|f|
      $stderr = $stdout = f
      puts "Meryがすき!・・・"
      warn "すきすきすき!・・"
      $stdout = STDOUT
    }

     |  いっち  |  返信
  6. こんにちは。

    > more +3 %0 | ruby -Ks
    なるほど!これは目からウロコでした。
    ありがとうございます。

    それでは。

     |  手石  |  返信
  7. Mery2 のアルファ以前には標準出力 (ウィンドウ分割で画面下部に出力) 機能ついてたんだけど、誰も使わないかと思って消しちまったッス。もう DOS 捨てても良い時代になったんじゃないすかね?まだかな・・・?w

     |  Kuro  |  返信
  8. こんにちは。

    > Mery2 のアルファ以前には標準出力 (ウィンドウ分割で画面下部に出力) 機能ついてたんだけど、
    > 誰も使わないかと思って消しちまったッス。
    > もう DOS 捨てても良い時代になったんじゃないすかね?まだかな・・・?w 

    現在の大きいフォントサイズ、小さいフォントサイズと同じように
    メニューからは、選択できなくとも、実は実行できるというような
    形でも便利かなと(個人的には)思います。

     |  いっち  |  返信
  9. こんにちは。

    マクロの標準主力なのかマクロから起動したアプリの標準出力なのか、
    で違うような気がします。
    もしかして、見当はずれだったらゴメンナサイ。

    >  DOS 捨てても良い時代
    ですね。でも、CUIの需要はそれなりにある気がします。
    と、昨晩PowerShellを見つけてさっぱりだけど興味津々の私が言ってみ
    ました。 

    それでは。

     |  手石  |  返信
スポンサーリンク