如何创建将多个文件作为参数的Shell上下文菜单项?


11

创建一个将单个文件作为参数的Windows Shell上下文菜单项很容易。有关示例,请参见此问题

但是,如何创建将多个文件作为参数的上下文菜单项?说,对于差异合并工具(在我的情况下为P4Merge),尽管相同的技术无疑也适用于其他应用程序。

我已经安装了P4Merge,但是它不会自动将一个项目添加到上下文菜单中,因此我将必须手动进行。

当我尝试使用时:

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

作为命令行,我得到了一个错误:

错误:至少需要两个文件。无法仅打开一个文件。P4Merge需要0、2或3个文件。

当我尝试使用时:

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

作为命令行,它打开了两个P4Merge实例,每个文件一个。

似乎正确的文件名正在传递到%0和%1,但每个文件都正在执行P4Merge应用程序的不同实例。

我目前有SourceGear的DiffMerge工具,该工具在Shell上下文菜单上有一个项目,并且效果很好,因为我能够选择两个文件并使用上下文菜单项在它们上运行差异。我正在尝试搜索注册表以查看DiffMerge使用的参数,但是找不到包含参数的DiffMerge命令行。


3
正如您所发现的,没有办法通过简单的注册表黑客来完成您想要的事情。只有%1,因为扩展名仅适用于一个对象,并且对多个对象分别执行。它需要编写一个完整的shell扩展。但是,有些程序/ shell扩展使您可以执行一些比注册表黑客所允许的更高级的上下文菜单操作。(我唯一记得的是MMM。)不幸的是,我认为它们倾向于仅限于创建子菜单,而不是允许放置多个对象。
Synetech

Answers:


20

您也可以尝试将程序添加到SendTo菜单。


是的,效果很好。
Synetech

1
工作完美。以下是说明了如何在Windows 7的应用程序添加到菜单的SendTo有没有必要添加任何命令行参数,只是下降的应用程序快捷方式到%APPDATA%\微软\的Windows \ SendTo文件夹。返回Windows资源管理器,选择两个文件,然后单击鼠标右键,然后选择“发送到”>“ P4Merge”对所选文件执行了比较。
SimonTewsi 2012年

4

浏览答案似乎没有简单的修补程序,需要外壳扩展程序。再次查看DiffMerge的注册表项,它似乎使用了shell扩展名:DiffMergeShellExtension64.dll。如果P4Merge没有这样的shell扩展,那么看来我可以在Windows资源管理器上下文菜单中使其正常工作的唯一方法是自己写一个。

Code Project中的《完整的傻瓜编写Shell扩展指南》系列是编写Shell扩展的有用指南。本系列的第二部分是关于编写一个扩展程序,该扩展程序可以一次处理多个文件(正是我所需要的)。

警告:《编写Shell扩展的完整傻瓜指南》使用C和COM,ATL(活动模板库)和MFC(Microsoft基础类)。因此,如果您不熟悉这些技术,则编写一个shell扩展将是一个漫长且可能很困难的过程。绝对不是一个小时内可以做的事情。


2

您可以使用我的程序context-menu-launcher(单实例)来完成

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.