last updated:2022/07/23

Hidemaru Q and A

第III部〜秀丸マクロのいろはにほへと
 外部プログラムの実行について


外部プログラムの実行について

はじめに

秀丸エディタのマクロから他のプログラム(実行ファイル)を起動する方法は複数あり、使用する命令文によって、出来ること/出来ないことがあります。

現状(2022/07/23現在)では単純にプログラムを実行するだけなら run文 でもいいです。複雑な事をする場合は、引数の指定が難しいですが runex文 をお勧めします。

命令文による違い
命令文 同期実行 リダイレクト
run ×
runsync/runsync2 ×
runex

○:問題なし。
△:制限あり。標準入出力を使う場合は Shift_JIS に変換される。
▽:制限あり。標準入出力は、Shift_JIS、UTF-8、UTF-16LEに対応。
×:不可。


同期実行
プログラムが終了するまで待機する。(プログラムの戻り値を取得可能)
リダイレクト
ファイルの内容を標準入力へ送ったり、標準出力をファイルへ取り込む。標準入出力を使う場合は、制限あり。ファイルから入力する場合は、保存してあるエンコードになります。

run系命令文の共通事項

  • 第II部〜知っていると便利な秀丸の機能 プログラム実行【1】共通の注意点を参照してください。

  • run系文実行時の result は、プログラムの実行に成功した場合は false以外に 、失敗した場合は false になります。 true かどうかではなく、falseではない事を確認した方が良いでしょう。

    run @"wscript.exe """ + macrodir + @"\argv.vbs"" %8C %B4 %88 %F6 %8B %86 %96 %BE";
    if(!result){
        //失敗した場合の処理
    
    }
  • プログラム実行に成功し、同期実行の場合は、実行したプログラムが返す「終了ステータス」を取得可能です。取得には、getresultex関数で、引数に「9」を指定します。

    runsync "xxxx.exe";
    #ret = getresultex(9);

    run文の場合は、同期実行に対応していないため、getresultex(9) は 常に「259」(同期しなかった)を返します。

個別の命令文について

run

非同期でプログラムの実行します。(プログラムを実行しても、終了を待たないで次の命令に進みます) 非同期なので、プログラムの「終了ステータス」を受け取ることは出来ません。

引数に、"<con" 、">con" 、"<ファイル名"、">ファイル名" などを付けることにより、標準入出力のリダイレクトが可能です。

第II部〜知っていると便利な秀丸の機能 プログラム実行【2】プログラム実行の方法その1を参照してください。

runsync,runsync2

同期でプログラムの実行します。(プログラムを実行すると、終了するまで待機します) 同期なのでプログラムの「終了ステータス」を受け取ることが可能です。リダイレクトは使用できません。

runsyncは、秀丸エディタ本体を最小化状態にして待機します。

runsync2は、秀丸エディタ本体はそのままの状態で待機します。

runex

run文/runsync文の拡張版で、引数がとても多い(14個)ですが、細かく実行状態を指定できます。詳細は以下のリンク先を参照の事。

書式は以下になります。

runex 実行ファイル名, 同期フラグ, 標準入力フラグ, 標準入力ファイル名, 標準出力フラグ, 標準出力ファイル名, 標準エラー出力フラグ, 標準エラー出力ファイル名, 作業フォルダフラグ, 作業フォルダ名, 表示フラグ, 非描画フラグ, エンコード, 拡張フラグ;

  • 同期フラグで、非同期実行/同期実行を指定できます。

  • リダイレクトを行う場合は、標準入力、標準出力、標準エラー出力の各フラグと、各ファイル名を設定すること。

  • 表示フラグで、3以降の意味は、 ShellExecuteA function (shellapi.h) の「nShowCmd」を参照の事。

  • エンコードで、文字コードを指定できます。現状は、ANSI(Shift_JIS)、UTF16-LE、UTF-8 を指定できます。

  • 拡張フラグで、"%f" 等の変換を抑制できます

  • 作業フォルダの使い方

    作業フォルダは、実行ファイルの実行時のフォルダを指定します。

    わかりやすい例だと、コマンドプロンプト(cmd.exe)実行時に作業フォルダを指定すると、そのフォルダをカレントにしたコマンドプロンプトを開くことができます。 PowerShell(powershell.exe、pwsh.exe)でも有効です。

    コマンドプロンプトを、マクロフォルダをカレントにした状態で開くマクロ

    runex "cmd.exe"
    //sync   0:async, 1:sync
    , 0
    //stdin  0:none, 1:auto, 2:<file, 3:(reserved), 4:current content, 5:selection
    , 0, ""
    //stdout 0:none, 1:auto, 2:>file 3:>>file, 4:new window, 5:insert, 6:replace, 7:>output pane, 8:>>output pane
    , 0, ""
    //stderr 0:none, 1:auto or >>stdout, 2-8:same as stdout's param
    , 0, ""
    //folder 0:none, 1:current, 2:specify 3:(reserved), 4:exe's
    , 2, macrodir
    //show   0:auto, 1:show, 2:hide, 3-13:ShellExecute()'s SW_*
    , 0
    //draw   0:draw, 1:no draw when stdout redirected
    , 0
    //encode 0:ansi, 2:utf-16, 6:utf-8
    , 0
    //extended flags
    , 0
    ;
    • おまけ

      コマンドプロンプト、PowerShell、Windows Terminal は、起動オプションを指定することで、任意のフォルダを開くことが可能です。(runex文ではなく、run文でも可能)

      • コマンドプロンプト

        cmd.exe /k cd /d "開きたいフォルダ"
      • PowerShell(Ver.5)

        powershell.exe -noexit -command Set-Location -literalPath '開きたいフォルダ'
      • PowerShell(Ver.7)

        pwsh.exe -WorkingDirectory "開きたいフォルダ"
      • Windows Terminal

        wt.exe new-tab --startingDirectory "開きたいフォルダ"

ページトップ 目次に戻る