結論から言えば、スクリプト呼出機能でなく、ブックマーク機能を使って解決する。
問題提起
秀丸ファイラのスクリプトは、js:<スクリプトのファイルパス>のようにして実行する。しかし、起動引数が渡せないという致命的な問題がある。
残念なケース
たとえば前回の例でいうと、表示したいメッセージを変えたいとき、起動引数で渡したい。でも渡せない。すると、メッセージのパターンだけソースコードが増えてしまう。そんな再利用性ゼロのコードなんて書きたくないのに。できるだけ重複部分を減らす工夫をするしかない。
cscript.exeで引数を渡す
前回の例であるメッセージ表示を使う。メッセージ部分を引数にする。
ShowMessage.js
WScript.Echo(WScript.Arguments(0));
cmd.exeを起動し、以下のように実行する。
cscript.exe ShowMessage.js "Hello Parameter !!"
Hello Parameter !!
これを秀丸ファイラでもやりたいのだができない。js:<スクリプトのファイルパス>の形式でしかスクリプトを呼び出せないから。本当はjs:<スクリプトのファイルパス> [引数]としたい。
WScript.Shell.RunでCScript.exeを呼び出す
var command = "cscript.exe ShowMessage.js \"これは引数で渡したメッセージです。\""; var shell = new ActiveXObject( "WScript.Shell" ); shell.Run(command, 1, true); shell = null;
秀丸ファイラで、このスクリプトをjs:<このファイルパス>として呼び出す。しかし、メッセージの種類だけソースコードファイルを作成することになってしまう。再利用性ゼロのコードができあがり。
さらなる問題
外部からソースコードをインポートできない。JScript, VBScriptの仕様である。WSFを用いれば可能だが、先述のとおり秀丸ファイラではjs,vbs呼出のみである。
main.jsからrun.jsで定義した関数を参照できない。
main.js
Run("cscript.exe ShowMessage.js \"これは引数で渡したメッセージです。\"");
run.js
function Run(command) { var shell = new ActiveXObject( "WScript.Shell" ); shell.Run(command, 1, true); shell = null; }
以上により、js: vbs:からのスクリプト実行では再利用性のあるコードが非常に書きづらい。事実上、書けないといっていいほど。
かなり悩んだが、結局、この方法ではまともな解決方法を見つけられなかった。
解決
私は一体何を悩んでいたのか。秀丸にはブックマーク機能がある。
メニュー→ツール→ツールの整理で、以下のパスを持ったツールを作成する。細かい手順は前回参照。
C:\WINDOWS\system32\cscript.exe "C:\ShowMessage.js" "引数で渡したメッセージ。"
あとはこれを実行すればいいだけ。これにて解決。
これはコンソールから叩くのと同じである。考えてみれば、ショートカットファイル(ソフトリンク)でも同じようなことができるので、できて当たり前だった。真っ先に思いつかないほうがおかしい。
JScript, VBScriptからの解放
コマンド入力できれば、もはやJScript, VBScriptを使う必要さえない。bat, sh(bash), powershell, python, ruby, 何でも好きなものを使えばいい。一体誰がJScript, VBScriptなど使うのか。
秀丸ファイラで選択したファイルやディレクトリを取得する
秀丸ファイラを使っているなら、GUIで選択したファイルや、現在ディレクトリのパスを取得できなければ意味がない。
| マクロ | 意味 | 
|---|---|
| %1 | 選択ファイル(複数可)をフルパスで、ダブルクォーテーションでくくる。 | 
| %f | 選択ファイル1つだけをフルパスで、ダブルクォーテーションでくくらない。 | 
| %b | 選択ファイル名のみ | 
| %d | フォルダ | 
| %V | フォルダ | 
| %% | %そのもの | 
秀丸ファイラのヘルプの「ブックマーク」項を参照。
先程ブックマーク機能に設定したコマンドに%Vを使えば、現在のディレクトリパスを取得できる。
C:\WINDOWS\system32\cscript.exe "C:\ShowMessage.js" "%V"
すっかり忘れていたが、秀丸ファイラからConEmuを呼び出すときに同じことをやっていた…。
所感
無駄に回り道した挙句、以前やっていたことだったときの徒労感と絶望感。