2009-09-12 10.00(正式版) では引数の解釈に関してが 9.5より前と同等になっているので,たいていの場合で要らなくなりました.ただ,実行時のカレントディレクトリが opera.exe のディレクトリになるので場合によっては必要です.

2008-12-20 9.63 で空白区切りは改善したものの,カレントディレクトリが元のままになっていたのに対応.9.59.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引数に.