2009-09-12 10.00(正式版) では引数の解釈に関してが 9.5より前と同等になっているので,たいていの場合で要らなくなりました.ただ,実行時のカレントディレクトリが opera.exe のディレクトリになるので場合によっては必要です.
2008-12-20 9.63 で空白区切りは改善したものの,カレントディレクトリが元のままになっていたのに対応.9.5⁄9.6系を使ってる場合アップデートを
Opera 9.5 での困った話のひとつとして 内部アクションのExecute Program の引数の解釈が変わったなんて話がありまして.
詳しくは続Execute programについてにまとまってます.
9.5になってからは 内部アクション “Delay” を使うことで時間差で処理できるようになったので,プロンプトを出してどうにかするopera_exの代替という解決法もあるにはあるけども,menu.iniを書き換えて指定しなおしてとちょっと面倒だったわけで.
opera_exだけなら,いいんですけどほかにも irvine.js が動かないとかもあってどげんかせんと(略
で,とりあえず irvine.js を直してスレに晒したのがこれ.irvine.js
irvine = new ActiveXObject("Irvine.Api");
var str = WScript.Arguments(0).split(/ /);
if (str[0] == 1) {
irvine.AddUrlAndReferer(str[2],str[(1)],0);
} else if (str[0] == 2) {
irvine.ClearImportLinks();
irvine.ImportLinks(str[1],0);
} else if (str[0] == 3) {
irvine.Paste(0);
};
要するに,Splitで引数を配列に戻して呼んでやるという単純な方法. Irvine右クリック拡張は? にあがってる WSH/JScript 経由のものはほとんどこれで対応できるはず. そいで opera_ex に応用したのがこれopera_ex_helper.js.
OperaのExecute programの問題点はこれで払拭された を受けてさらに修正.カレントディレクトリが変わらない問題と,パスに空白がある場合の問題に対応.feedback多謝.
var exe = "c:\\tools\\opera_ex.exe"; // \をエスケープすること
var cmdline = '\"' + exe + '\"' + " " + ( ( WScript.Arguments.length != 0 ) ? WScript.Arguments(0) : "" );
var WShell = WScript.CreateObject("WScript.Shell");
WShell.CurrentDirectory = exe.substring( 0, exe.lastIndexOf( "\\" ) );
//WScript.Echo( exe ); WScript.Echo( workdir ); WScript.Echo( cmdline );
WShell.Run( cmdline );
で,上のコードを opera_ex_helper.js てな感じの名前で保存しておいて, exe の opera_ex.exe へのパスを適宜修正したうえで,menu.iniの opera_ex を使ってた部分,たとえば
Item, "aタグを挿入してコピー" = Copy & Execute program,"C:\tools\opera_ex.exe","-a -x %u"
を
Item, "aタグを挿入してコピー" = Copy & Execute program,"C:\tools\opera_ex_helper.js","-a -x %u"
とすると,opera_exがまた使えるようになるかと.
もうちょっと汎用化してみた
これで,いちいちヘルパーを作らなくてもいけるようになったと思う. exe_prog_helper.js
var a0 = WScript.Arguments(0);
var exe = a0.substring( 0, a0.lastIndexOf( "|" ) );
var args = a0.substring( a0.lastIndexOf( "|" ) + 1 );
var workdir = exe.substring( 0, exe.lastIndexOf( "\\" ) );
var cmdline = '\"' + exe + '\"' + " " + ( args.length != 0 ? args : "" );
var WShell = WScript.CreateObject("WScript.Shell");
WShell.CurrentDirectory = workdir;
WShell.Run( cmdline );
ただし,menu.ini のほうの
Item, "aタグを挿入してコピー" = Copy & Execute program,"C:\tools\opera_ex.exe","-a -x %u"
を
Item, "aタグを挿入してコピー" = Copy & Execute program,"C:\tools\exe_prog_helper.js","C:\tools\opera_ex.exe|-a -x %u"
という風に,呼び出すソフトとその引数を “|“でつなげて Execute program の第2引数に.