如何在 Windows 资源管理器的上下文菜单中添加仅针对大于某个阈值的文件的选项?
例如,当在 Windows 资源管理器的上下文菜单中添加一个条目,以 15 GB 的块为单位拆分文件,我希望仅当选定的文件超过 15 GB 时才出现上下文菜单项。
答案1
(这是我在Quora回答留在那里的这个问题的副本。)
谢谢你的提问!说实话,我通常不会把几乎回答这个问题并不需要付出太多努力。但这个问题恰好与我正在做的一个项目有关,而且我仍然喜欢它变得如此简单,因为我以为我必须编写一个 Windows 程序,其中包含各种复杂的部分来与 Windows shell 对话并动态添加和删除菜单选项,结果发现它只需要在注册表中增加六个新条目。非常酷。
此功能的文档位于https://docs.microsoft.com/en-us/windows/win32/shell/context-menu-handlers。这有点令人望而生畏,因为它讨论了所有选项,包括复杂的选项。但你想要的是“使用高级查询语法获取静态动词的动态行为”。
高级查询语法是您在文件资源管理器中搜索文件时不知不觉使用的语法。例如,如果我在搜索框中输入“test”,它会查找名称中带有“test”的文件。
但如果我使用“搜索”选项卡中的菜单说“我只想查找本周修改的文件,大小在 16K 到 1MB 之间”,那么结果集就会比较少。您可以看到,菜单实际上是通过在搜索框中添加更多术语(如“datemodified:thisweek”和“size:small”)来实现这一点的 — 它实际上是在为您构建高级查询语法查询。
如果你是高级用户,一旦你意识到发生了什么,你可以开始进行菜单不允许您执行的查询 - 例如“显示名称中带有'test'的所有文件,最后修改时间在2020年初之前,大小在2K到5K之间” - 通过自己使用高级查询语法关键字(在本例中为“test datemodified:<2020-01-01 size:>2000 size:<5000”)。
因此,这让我们知道您要做什么,即创建一个用于划分文件的上下文菜单选项。假设执行此操作的程序是 C:\Program Files\divider.exe。您可以通过为其指定文件名和大小来运行它,如下所示:
C:\Program Files\divider.exe /size:15000000000 C:\MyData\MyHugeFile.txt
正如“创建快捷菜单处理程序”文档的其余部分所示(在此处插入雄伟的挥手),如果您只想将其添加为所有文本文件的菜单选项,则可以使用以下一组注册表项来完成:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\txtfile\shell\divide]
@="Divide Large File"
[HKEY_CLASSES_ROOT\txtfile\shell\divide\command]
@="\"C:\\Program Files\\Divider.exe\" /size:15000000000 \"%1\""
这将创建一个新的上下文菜单命令“分割大文件”,该命令针对文本文件(扩展名为“.txt”的文件)显示。当用户选择该命令时,将启动分割程序来分割文件。
但是你想要更具体的东西——你只想在非常大的文件上显示它。所以我们在注册表中添加了一行神奇的行。(实际上我会添加两行——让我们让它只在你选择一个文件时出现,因为这听起来像是一个相当密集的操作。)
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\txtfile\shell\divide]
"AppliesTo"="System.Size:>15000000000"
@="Divide Large File"
"MultiSelectModel"="Single"
[HKEY_CLASSES_ROOT\txtfile\shell\divide\command]
@="\"C:\\Program Files\\Divider.exe\" /size:15000000000 \"%1\""
“AppliesTo” 值表示“仅当所选文件与此高级查询语法查询匹配时才显示此菜单选项 — 在这种情况下,如果大小大于 15 GB。”(而“MultiSelectModel”行表示“仅当选择了单个文件时才显示此选项。”)
现在我已经拥有了这个非常有用的工具,它可以用于许多其他微妙的上下文相关的事情,只需在注册表中添加几行文本即可。
(我想起了这样一个故事:有个司机因为引擎运转不正常,把车送到修理厂。修理工说修好要 100 美元。司机同意了。修理工在引擎盖下查看了一会儿,然后拿起锤子敲了一下一个连接器。引擎立刻开始像小猫一样发出呼噜声。司机很惊讶,但也很生气。“这怎么值 100 美元?你只不过用锤子敲了一下而已!”修理工笑了。“哦,用锤子敲是免费的。知道该敲哪里吗?那是什么才值 100 美元。”)