複数のファイルを引数として取るシェルコンテキストメニュー項目を作成するにはどうすればよいですか?


10

単一のファイルを引数として取るWindowsシェルのコンテキストメニュー項目を作成するのは簡単です。例については、この質問を参照してください。

しかし、複数のファイルを引数として取るコンテキストメニュー項目をどのように作成しますか?たとえば、diff-mergeツール(私の場合はP4Merge)の場合、同じテクニックが他のアプリケーションにも適用できることは間違いありません。

P4Mergeをインストールしましたが、コンテキストメニューに項目を自動的に追加しないため、手動で追加する必要があります。

私が使ってみたとき:

"C:\Program Files\Perforce\p4merge.exe" %1 %2

コマンドラインとしてエラーが発生しました:

エラー:少なくとも2つのファイルが必要です。ファイルを1つだけ開くことはできません。P4Mergeには0、2、または3つのファイルが必要です。

私が使ってみたとき:

"C:\Program Files\Perforce\p4merge.exe" %0 %1

コマンドラインとして、ファイルごとに1つずつ、2つのP4Mergeのインスタンスを開きました。

正しいファイル名が%0と%1に渡されているようですが、それぞれに対してP4Mergeアプリケーションの異なるインスタンスが実行されています。

現在、SourceGearのDiffMergeツールがあります。これは、シェルコンテキストメニューに項目があり、2つのファイルを選択して、コンテキストメニュー項目を使用してそれらのファイルでdiffを実行できるため、美しく機能します。レジストリを検索してDiffMergeが使用する引数を確認しようとしましたが、引数を含むDiffMergeコマンドラインが見つかりませんでした。


2
ご存知のように、単純なレジストリハックで目的の操作を行う方法はありません。拡張は1つのオブジェクトにのみ適用され、複数のオブジェクトに対して個別に実行されるため、%1しかありません。完全なシェル拡張をプログラミングする必要があります。ただし、レジストリハックで許可されているよりも高度なコンテキストメニューを実行できるプログラム/シェル拡張がいくつかあります。(私が覚えているのはMMMだけです。)残念ながら、それらは複数のオブジェクトをドロップできるようにするのではなく、サブメニューの作成に限定される傾向があると思います。
Synetech 2012

回答:


19

SendToメニューにプログラムを追加することもできます。


うん、それはうまくいきます。
Synetech 2012

1
完璧に働きました。ここにある命令を任意のコマンドラインパラメータを追加する必要はありませんでしたのWindows 7でのSendToメニューにアプリケーションを追加する方法については、単に%APPDATA%\マイクロソフト\ Windowsの\ SendToフォルダにアプリケーションのショートカットを落としました。Windowsエクスプローラーに戻り、2つのファイルを選択して右クリックし、[送る]> [P4Merge]を選択すると、選択したファイルに対して差分が実行されました。
SimonTewsi

3

答えを参照すると、単純な修正はなく、シェル拡張が必要であるようです。DiffMergeのレジストリエントリをもう一度見ると、シェル拡張:DiffMergeShellExtension64.dllを使用しているようです。P4Mergeにこのようなシェル拡張がない場合、Windowsエクスプローラーのコンテキストメニューで正しく機能させる唯一の方法は、自分で作成することです。

Code Project の「完全な馬鹿のシェル拡張の記述ガイド」シリーズは、シェル拡張の記述に役立つガイドです。シリーズのパートIIは、複数のファイルを一度に処理する拡張機能(まさに私が必要とするもの)を記述することです。

警告:完全な馬鹿のシェル拡張の作成ガイドでは、CおよびCOM、ATL(アクティブテンプレートライブラリ)、MFC(Microsoft Foundation Classes)を使用しています。したがって、これらのテクノロジーに慣れていない場合、シェル拡張を作成することは、長くて潜在的に難しいプロセスになるでしょう。1時間でできることではありません。


2

あなたは私のプログラムcontext-menu-launcher(singleinstance)でそれを行うことができます:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\Shell\p4merge]
"MultiSelectModel"="Player"

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\Shell\p4merge\Command]
@="\"d:\\singleinstance.exe\" %1 \"C:\\Program Files\\Perforce\\p4merge.exe\" $files --si-timeout 400"

.exe自動ダウンロードが開始されることを明確にしない限り、回答のファイルに直接リンクしないでください。
DavidPostill

ありがとうございます。シングルインスタンスアプリケーションを任意のファイルタイプに関連付ける方法はありますか。ファイルタイプごとのファイルの関連付けに個別に追加する方法はありませんか。たとえば、現在、DiffMergeを使用して、XMLファイル、SQLスクリプト、構成ファイル、*。csファイル、.gitignoreファイルなどを比較しています。
SimonTewsi 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.