第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文
- 秀丸エディタヘルプの「プログラム実行の詳細(オプション指定時)」
書式は以下になります。
runex ファイル名, 同期フラグ, 標準入力フラグ, 標準入力ファイル名, 標準出力フラグ, 標準出力ファイル名, 標準エラー出力フラグ, 標準エラー出力ファイル名, フォルダフラグ, フォルダ名, 表示フラグ, 非描画フラグ, エンコード, 拡張フラグ;
- 同期フラグで、非同期実行/同期実行を指定できます。
- リダイレクトを行う場合は、標準入力、標準出力、標準エラー出力の各フラグと、各ファイル名を設定すること。
- 表示フラグで、3以降の意味は、 ShellExecuteA function (shellapi.h) の「nShowCmd」を参照の事。
- エンコードで、文字コードを指定できます。現状は、ANSI(Shift_JIS)、UTF16-LE、UTF-8 を指定できます。
- 拡張フラグで、"%f" 等の変換を抑制できます