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

hidemaru Editor

Hidemaru Q and A

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


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

【0】はじめに
【1】run系命令文の共通事項
【2】個別の命令文について

はじめに

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

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

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

○:問題なし △:制限あり ×:不可

同期実行
プログラムが終了するまで待機する。(プログラムの戻り値を取得可能)
リダイレクト
ファイルの内容を標準入力へ送ったり、標準出力をファイルへ取り込む。

run系命令文の共通事項

  • コマンドラインに指定する文字列内に

    • %f
    • %d
    • %b
    • %n
    • %l
    • %c

    の文字がある場合、対象の内容に置換されてプログラムに引き渡されます。 (大文字小文字の区別はありません)
    特に、パーセントエンコード/URLエンコード を含む文字列を指定する場合は、注意が必要です。 (runex文の場合、置換を抑制するオプションあり)

    "C:\Program Files\Hidemaru\HIDEMARU.TXT" を秀丸エディタで開いている状態では、以下の内容に置換されます。

    %f

    開いているファイルのフルパス

    C:\Program Files\Hidemaru\HIDEMARU.TXT
    %d

    開いているファイルのフォルダ名

    C:\Program Files\Hidemaru
    %b

    開いているファイルのファイル名

    HIDEMARU.TXT
    %n

    開いているファイルのファイル名から拡張子を除いたもの

    HIDEMARU
    %l
    カーソル位置の行番号(先頭が1)
    %c
    カーソル位置の桁(先頭が1)、マクロの column と同じくタブ文字も1文字とカウントします。

    例えば、以下のVbscript に "%8C %B4 %88 %F6 %8B %86 %96 %BE" という文字列を引数として指定し、run文で実行してみます。

    Option Explicit
    
    Dim WshArgs
    Dim Argv
    Dim i
    
    Argv = ""
    
    '引数の取得
    Set WshArgs = WScript.Arguments
    For i = 0 to WshArgs.Count - 1
        Argv = Argv & cstr(i) & " -->" & WshArgs(I) & "<--" & vbcrlf
    Next
    set WshArgs = Nothing
    
    Wscript.echo Argv
    Wscript.quit

    実行するマクロ

    run @"wscript.exe """ + macrodir + @"\argv.vbs"" %8C %B4 %88 %F6 %8B %86 %96 %BE";

    出力結果

    ---------------------------
    Windows Script Host
    ---------------------------
    
    0 -->%8C<--
    1 -->HIDEMARU.TXT4<--
    2 -->%88<--
    3 -->C:\Program<--
    4 -->Files\Hidemaru\HIDEMARU.TXT6<--
    5 -->%8B<--
    6 -->%86<--
    7 -->%96<--
    8 -->HIDEMARU.TXTE<--
    
    ---------------------------
    OK
    ---------------------------

    "%8C %B4 %88 %F6 %8B %86 %96 %BE" に含まれる、"%B"、"%F"が、ファイル名、フルパスに変換されて、プログラムに引き渡されています。 さらに、フルパスの場合、スペースが含まれている為、引数の数も違ってしまっています。

  • 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" 、"<ファイル名"、">ファイル名" などを付けることにより、標準入出力のリダイレクトが可能です。

    • "<con"は、範囲選択していた場合はその範囲を、それ以外の場合はファイルの内容を標準入力へ送ります。 標準入力は、ファイルの内容を、Shift_JISに変換して入力します。
    • ">con"は、範囲選択していた場合はその範囲へ、それ以外の場合は新規の秀丸エディタへ、標準出力の内容を出力します。 標準出力はShift_JISである事を前提としています。
    • "<ファイル名"は、指定されたファイルの内容を標準入力へ送ります。
    • ">ファイル名"は、指定されたファイルへ、標準出力の内容を保存します。
  • runsync,runsync2

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

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

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

  • runex

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

    書式は以下になります。

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

    • 同期フラグで、非同期実行/同期実行を指定できます。
    • リダイレクトを行う場合は、標準入力、標準出力、標準エラー出力の各フラグと、各ファイル名を設定すること。
    • 表示フラグで、3以降の意味は、 ShellExecuteA function (shellapi.h) の「nShowCmd」を参照の事。
    • エンコードで、文字コードを指定できます。現状は、ANSI(Shift_JIS)、UTF16-LE、UTF-8 を指定できます。
    • 拡張フラグで、"%f" 等の変換を抑制できます

目次に戻る