X-Finderからエクスプローラのコンテキストメニューを実行するスクリプト 2011-04-10 (Sun) 02:36

X-Finderではコンテキストメニューの設定で標準メニューを表示するような設定にしておけば、エクスプローラに登録されているコンテキストメニューのコマンドはX-Finderの右クリックから余裕で実行できるわけだが、右京さん張りに細かいことに拘る筆者はどうしても拡張メニューオンリーでいきたい。でもエクスプローラのコンテキストメニューも実行したい。もちろん拡張メニューから。
むぅ~~なんとわがままな奴なのだ!

以前書いたExplzhの「書庫作成」を実行する - X-Finderスクリプト のような裏技的な方法じゃなく、もっとスマートで汎用性のある方法で実現してやろうとある日心に誓う。

とはいうものの正直何をどうやればよいのかよくわからなかったので気が向いたときにポツポツと調べてなんとか先頃めでたく完成を見たのであった。思い起こせばX-Finderでスクリプトが使えるようになったのを機にJScriptを始め幾星霜…(-_-)
とかやっとる場合じゃないですな。(´・ω・`)y-~~~

◎使用方法
1.後述の「コンテキストメニュー実行.js」をX-Finderのscriptフォルダに保存する。

2.環境変数Arg1、Arg2に以下の内容のパラメタをセットする。
Arg1 : 単一選択時のコンテキストメニューコマンド名 ex) 検査 (&S)
Arg2 : 複数選択時のコンテキストメニューコマンド名 ex) 選択した項目をウイルスについて検査する (&S)

・単一選択の場合と複数選択の場合でコマンドの名称が異なる場合があるため、各々の名称をセットする必要がある。
・単一選択と複数選択でコマンドの名称が同じ場合でもArg1、Arg2にそれぞれ同じものをセットする必要がある。
・アクセスキー(ショートカットキー)は上記例のようにキーの前に「&」を付けて表現する。
・Arg1の名称の指定はコマンド名に部分一致するだけでも可だが必ず一意になるように指定する必要がある。

例えばAvast6のコンテキストメニューでは単一選択の場合 「検査 (S) test.exe」のようにファイル名までコマンドに含まれてしまうのでこのような場合は「検査 (&S)」(「検査」だけでもいいかも)と指定しておけばよい。


3.コンテキストメニュー実行.jsを呼び出す。


◎ランチャの設定例
Avast6のウイルスチェックを実行する場合

パス
Set:Arg1=検査 (&S)
Set:Arg2=選択した項目をウイルスについて検査する (&S)
Include:JScript コンテキストメニュー実行.js


FireFileCopyを実行する場合

パス
Set:Arg1=&FireFileCopy
Set:Arg2=&FireFileCopy
Include:JScript コンテキストメニュー実行.js


「秀丸エディタで開く」を実行する場合(拡張子をtxtに限定したフィルタリングを併用)

パス
Set:Arg1=秀丸エディタで開く
Set:Arg2=秀丸エディタで開く
Include:JScript コンテキストメニュー実行.js

動作
パスにフォーカス項目を渡して実行

拡張
*.txt



※ランチャなんで右クリック以外ツールボタンやメニューからでも呼び出せる(ハズ)。


◎注意事項
・エクスプローラのコンテキストメニューで階層になっているコマンドは実行できない。たぶんWHSの仕様。 ex)送る(N)など
・拡張子ごとのコマンドを実行する場合は別の拡張子のファイルに誤って実行されないように注意すること。(フィルタリング使うべし)
・ファイルを選択しない場合はカレントフォルダに対してコマンドを実行する。
・動作確認はWindwosXPのみ。Vista以降で動くのか不明。


コンテキストメニュー実行.js
var oFs = new ActiveXObject("Scripting.FileSystemObject");
var oShell = new ActiveXObject("Shell.Application");
var cSel = WScript.Col(WScript.Env('CurrentSelected'));
var sVerb1 = new RegExp(WScript.Env('Arg1').replace(/\(/i,'\\(').replace(/\)/i,'\\)'),'i');
var sVerb2 = WScript.Env('Arg2');
var oFolder, cItems, oItem, sFilter = '';

if(sVerb2 == '' && cSel.Count > 1) WScript.Quit();
switch(cSel.Count){
case 0: // 選択されていなければカレントフォルダを対象とする
case 1:
var sTarget = (cSel.Count == 0)?WScript.Env('Current'):cSel.Item(0);
var sParent = oFs.GetParentFolderName(sTarget);
if((oFolder = oShell.NameSpace(sParent)) != null){
var sFileName = oFs.GetFileName(sTarget);
if((oItem = oFolder.ParseName(sFileName)) != null){
var sVerb, cVerbs = oItem.Verbs();
for(var i = 0; i < cVerbs.count; i++){
sVerb = cVerbs.item(i).Name;
if(sVerb.match(sVerb1)) oItem.InvokeVerb(sVerb);
}
}
}
break;
default:
var sParent = oFs.GetParentFolderName(cSel.Item(0));
for(var i = 0; i < cSel.Count; i++){
sFilter += oFs.GetFileName(cSel.Item(i)) + ';';
}
if((oFolder = oShell.NameSpace(sParent)) != null){
cItems = oFolder.Items();
//SHCONTF_FOLDERS 0x20 フォルダ
//SHCONTF_NONFOLDERS 0x40 ファイルオブジェクト
//SHCONTF_INCLUDEHIDDEN 0x80 隠しオブジェクトとシステムオブジェクト
cItems.Filter(0xE0, sFilter);
cItems.InvokeVerbEx(sVerb2);
}
break;
}

関連記事

コメントの投稿

管理者にだけ表示を許可する

注意事項
基本的にこのブログはブログ主の備忘録です。

ブログの内容にはブログ主の主観や時には正確でない情報が含まれていることもあります。書いてある内容がすべての環境にあてはまることを保証するものでもありません。
また過去の記事の情報はそれが参照された時点では既に陳腐化していることもあります。

その辺をご理解の上で当ブログ内に書いてあることを試す場合は自己責任でお願いします。

万一何らかの損害が生じても責任は持てませんのであしからず!

記事内容の誤りの指摘、疑問点の回答などコメント頂けると助かります。
カレンダー
02 | 2017/03 | 03
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
ブログ内検索
カラーコードチェッカ
カラーコードの確認
入力例) #ffffff | blue
カテゴリ
最新記事
最新コメント
最新トラックバック
リンク
ブロとも申請フォーム

この人とブロともになる

メールフォーム

名前:
メール:
件名:
本文: