【问题标题】:How do I add a right-click option to search the web using a selected file's name?如何添加右键单击选项以使用选定文件的名称搜索网络?
【发布时间】:2015-10-14 07:16:57
【问题描述】:

我希望在 Windows 资源管理器的右键菜单中添加一个选项,该选项将启动 Chrome 并在特定站点中搜索该文件的名称。更具体地说,我希望能够在视频文件上执行此操作,然后为其查找可用的字幕。我知道有许多程序可以做一些变化,但是在尝试了一堆之后,我还没有找到我想要的。不仅如此,我宁愿使用一些轻量级的原生代码,也不愿安装其他程序。

我找到的最接近指南的是in this post,但它并不完全有效。当然,我已经尝试清理它以满足我的需要,但它仍然不起作用,所以我认为那里有一个缺陷。这是我到目前为止所拥有的......

以管理员身份运行命令提示符,我执行了这两行将它们添加到注册表:

REG ADD "HKLM\software\Classes\*\shell\Subtitle Search" /d "Subtitle Search"
REG ADD "HKLM\software\Classes\*\shell\Subtitle Search\Command" /d "C:\My Projects\My Code\SubtitleSearch.bat ""%1"""

我用以下内容创建了一个批处理文件(SubtitleSearch.bat):

set xGOOGLESEARCH=%~nx1
cmd /c "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" "http://subscene.com/subtitles/title?q=%xGOOGLESEARCH%"

这看起来很简单,但它不起作用。相反,Windows 认为我正在尝试打开文件,并询问我要使用什么程序。顺便说一句,如果我选择 Chrome,它实际上会开始在选项卡中播放视频。

我确信问题出在注册表代码上,但我不知道如何告诉系统我不想打开我右键单击的文件;我只想使用它的文件名。我熟悉注册表,但不够熟练,无法了解问题所在。

提前感谢您的帮助!

【问题讨论】:

  • 您是否检查过注册表中的值是否正确(关于引号和所有内容)。另外,为什么不直接使用start http://subscene.com/subtitles/title?q=%xGOOGLESEARCH% 执行url。它将在默认浏览器中启动它,无论它是哪一个或安装在哪里。
  • 据我所知,是的 - 它已成功添加到注册表中。
  • 关于搜索的执行,您的方法可能同样好,但无论如何我都无法进入该过程中的那一步。顺便说一句,我确实独立运行了该部分,并且执行得很好。
  • 你试过直接制作.reg文件吗?

标签: batch-file command-line cmd registry regedit


【解决方案1】:
@echo off
setlocal

rem Process 1st argument passed.
if "%~1" == "/?" goto :help
if "%~1" == "/query" goto :query
if "%~1" == "/register" goto :register
if "%~1" == "/unregister" goto :unregister
if "%~1" == "" exit /b 1
goto :search
exit /b 0


:help
echo Open chrome search page with filename as the item to search.
echo:
echo Syntax: "%~nx0" keyword
echo:
echo Arguments:
echo   /?
echo       This help message.
echo   /query
echo       View a query of registered entries.
echo   /register
echo       Register context menu entries.
echo   /unregister
echo       Unregister context menu entries.
exit /b 0


:query
reg query "HKLM\software\Classes\*\shell\Subtitle Search" /s
exit /b 0


:register
echo Register subtitle search
reg add "HKLM\software\Classes\*\shell\Subtitle Search" /d "Subtitle Search" /f
reg add "HKLM\software\Classes\*\shell\Subtitle Search\Command" /d "\"%~f0\" \"%%1\"" /f
if errorlevel 1 net session >nul 2>&1 || echo Require admin to register.
exit /b 0


:search
rem Filename as item to search. If want extension also, use nx modifiers instead of just n.
set "search=%~n1"

rem URL used as the search engine.
:: set "url=https://www.google.com/search?q="
set "url=https://www.startpage.com/do/search/?q="
:: set "url=http://subscene.com/subtitles/title?q="

rem Use start so that the window does not remain open. CMD not being called so surrounding double quotes not stripped.
start "" "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" "%url%%search%"

rem View CMD /?. Surrounding double quotes and more than 1 pair may have the outer pair stripped. Add another escaped pair to be stripped.
:: cmd /s /c ^""C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" "%url%%search%"^"

rem Uncomment command to check commandline of cmd.exe.
:: wmic process where caption="cmd.exe" get commandline & pause
exit /b 0


:unregister
echo Unregister subtitle search
reg delete "HKLM\software\Classes\*\shell\Subtitle Search" /f
if errorlevel 1 net session >nul 2>&1 || echo Require admin to unregister.
exit /b 0

代码中的问题:

  • 使用reg 命令时,使用反斜杠转义内部双引号,即"""""\"\""
  • 转义% 与另一个% 签名,以便reg 可以添加文字%1,即%1%%1
  • Windows 认为我正在尝试打开文件”可能是由双引号问题引起的,因为我还没有重现。
  • 如果命令周围有双引号并且有超过 2 个双引号,CMD 可能会去除双引号。 查看cmd /?解析规则:

    如果指定了 /C 或 /K,则命令行后面的剩余部分 开关作为命令行处理,其中以下逻辑是 用于处理引号 (") 字符:

    1. 如果满足以下所有条件,则引用字符 在命令行上被保留:

      • 没有 /S 开关
      • 正好两个引号字符
      • 两个引号字符之间没有特殊字符, 其中 special 是以下之一:&()@^|
      • 之间有一个或多个空白字符 两个引号字符
      • 两个引号字符之间的字符串是名称 一个可执行文件。
    2. 否则,旧行为是查看第一个字符是否为 一个引号字符,如果是这样,去掉前导字符和 删除命令行上的最后一个引号字符,保留 最后一个引号字符之后的任何文本。

我已将脚本合二为一,您可以通过以下方式注册:

search /register

预期输出:

Register subtitle search
The operation completed successfully.
The operation completed successfully.

确保将命令提示符用作管理员,因为注册到HKLM 分支可能需要它。脚本所在的位置是添加到注册表的路径。所以不要在任何地方注册并稍后将其移动到正确的路径。

通过以下方式查询注册表项:

search /query

预期输出:

HKEY_LOCAL_MACHINE\software\Classes\*\shell\Subtitle Search
    (Default)    REG_SZ    Subtitle Search

HKEY_LOCAL_MACHINE\software\Classes\*\shell\Subtitle Search\Command
    (Default)    REG_SZ    "C:\My Projects\My Code\search.cmd" "%1"

查看帮助信息:

search /?

如果取消注释 :search 标签中的 wmic 命令,则在打开的控制台中进行搜索的输出为:

CommandLine
cmd /c ""C:\My Projects\My Code\search.cmd" "C:\My Projects\My Code\Alice In Wonderland.mp4""

Press any key to continue . . .

默认情况下,此命令应作为注释禁用或删除,仅用于检查命令行。

如果 startpage.com 用于搜索引擎,Chrome 会在此 URL 处打开:

https://www.startpage.com/do/search/?q=Alice%20In%20Wonderland

如果提到的这两个参数都没有传递,并且第一个参数是什么,那么搜索是用 Chrome 完成的。没有参数只会结束脚本,因为它对处理任何内容都没用。

我无法访问subscene.com 站点,因此我添加了一些其他 URL 用于测试。

cmd 命令被禁用,start 的使用已添加,因此控制台窗口关闭并打开 Chrome。我在脚本中留下了cmd,所以你可以看到它可以工作。

注销:

search /unregister

预期输出:

Unregister subtitle search
The operation completed successfully.

确保将命令提示符用作管理员,因为从 HKLM 分支注销可能需要它。脚本的位置无关紧要,因为它会删除整个注册表项。

【讨论】:

  • 哇,这个回答好透彻! 谢谢!我读了好几遍,但我想我终于明白了。)我不是注册表专家,所以谢谢你解释我的错误.更重要的是,感谢您创建了一个全面的一体化脚本!我现在要试试这个,但我很困惑你所说的 “没有参数只会结束脚本,因为它对处理任何内容没有用处。” 我理解 register i> 和 view help 参数...我知道不使用参数会运行搜索,但后来我迷路了。还有哪些缺失的参数会结束脚本?
  • 我可能没有像我想象的那样跟随。我创建了 bat 文件,但注册它却有意想不到的结果。如果我只是复制注册表行并从脚本位置在 cmd (Admin) 中运行它们,我可以看到我最初创建的注册表项已使用您的代码进行了更新。 完美。 但后来我想看看通过从 bat 文件运行 /register 会发生什么......由于某种原因,它变回了我的旧值!如何?它甚至从哪里提取旧值?在 cmd 中运行行修复它并从脚本运行再次破坏它。
  • 没有参数意味着不搜索或任何东西。想象一下,如果您双击不传递任何参数的文件。该脚本将只是exit,而不是尝试处理""。如果你使用上下文菜单,很怀疑"" 将作为第一个参数传递,所以它应该与正常操作无关。至于在寄存器上改回旧值,我不明白这一点,因为代码中没有任何东西可以改变任何东西。取决于从哪里读取,即如果从 HKCR 的条目中读取,并且如果您之前在 HKCU 中注册,那么这将推翻此脚本使用的 HKLM。后者是猜测
【解决方案2】:

批处理文件路径包含空格,所以你必须用引号括起来:

REG ADD "HKLM\software\Classes\*\shell\Subtitle Search\Command" /d "\"C:\My Projects\My Code\SubtitleSearch.bat\" \"%1\""

【讨论】:

  • 谢谢,但是当我尝试添加它时,这给了我一个 Invalid syntax 错误。虽然我通常理解多个引号,但我不得不承认我在这里感到困惑。引号中的第一段 (HKLM\...) 不应该也有多个引号吗?
  • 我的错,对不起,刚刚测试并更新了答案。
  • 好的,现在可以正确添加到注册表中了。谢谢你。不幸的是,它只会让我回到原点。当我尝试从右键菜单运行文件时,Windows 仍然认为我正在尝试使用其他程序打开文件。
  • 我在 Win8 上,但我不明白这会是什么问题。不幸的是,我没有一个带有早期操作系统的系统来自己测试它。在右键菜单中,它夹在 OpenOpen as 之间,这让我相信它被插入了错误的部分。这个位置并不困扰我,我只是想知道它是否与 Windows 认为它​​应该打开文件有关。
【解决方案3】:

我认为您不需要将命令行末尾的 ""%1"" 内容放入注册表。选择打开文件的可执行文件将目标文件隐式获取为 %1。无需在命令行中明确说明。事实上,我认为 %1 甚至没有在那个上下文中定义,只是在你的批处理文件中。最后一部分可能被解释为文字参数 String,这对于批处理解释器没有意义。您是否尝试在批处理文件顶部的某处使用echo %1 来检查其值?

编辑:该死! 4 年 9 个月等待进一步的答案......我为你感到难过:(

【讨论】:

  • 非常感谢您的回复!哈哈,已经有一段时间了,但我有点放弃了,继续前进。但是现在有了所有额外的时间,我真的很想让这个工作。 (我应该警告你我有点生疏了,所以请多多包涵。)我无法告诉你为什么“%1”存在,除了它在我最初开始的代码中,但我认为是获取文件名的部分。可悲的是,我只是尝试删除它并没有改变任何东西。另外,我不能真正尝试“echo %1”的想法,因为当我右键单击时我无法让它正确启动,所以我什至无法做到这一点。
  • 好吧,自从 5 年前的 WindowsXP(?) 以来,Windows10(64 位)的注册表发生了很多变化。也许您需要先尝试手动设置命令菜单条目才能使其正常工作。或者,您将“真实”批处理文件替换为仅执行 echo + pause 的批处理文件。此外,您可以在脚本开头的某处添加set /p filename=Movie filename: 。然后尝试在控制台窗口上拖放文件。该路径应插入到命令提示符中。当然,在内部您需要正确连接%filename%
  • 您也可以尝试使用 sendto 文件夹。在文件资源管理器中输入shell:sendto 作为地址以到达那里。如果你在那里为你的脚本添加一个快捷方式,你至少可以右键单击任何文件,然后选择“发送到”,然后选择你的脚本。
  • 说实话,我从来没有想过尝试添加到 sendto 文件夹,我什至没有意识到它可以这么容易地完成。做不到这个肯定是有可能的。
【解决方案4】:

您为什么不制作一个 .reg 文件来创建一个右键菜单来执行您想要做的事情?我不清楚你的目标,所以我只能这样做。

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\*\shell\StartChrome]
@="Start google chrome and search for ____ website"
[HKEY_CLASSES_ROOT\*\shell\StartChrome\command]
@="cmd /min /c \"start chrome.exe google.com"

这是一个 .reg 文件,它创建一个显示“Start google chrome and search for ____ website”的右键单击菜单提示,然后启动 chrome 并转到 Google.com。在最后的@="" 部分,在引号中,输入您想要在激活时右键单击执行的操作。在第一个@="" 部分中,您可以在右键菜单中选择应该说的内容。如果您想摆脱右键菜单选项,请转到注册表并转到您在第二行和第四行中指定的注册表部分并将其删除。然后你可以重新启动资源管理器,选项就会消失。

我用brave而不是chrome用brave.exe替换chrome.exe进行了测试,打开google.com可以正常工作。在 reg 文件的命令部分中,%1 是您右键单击以显示提示的内容。 这是我尝试做你想做的事情的最佳尝试:

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\*\shell\StartChrome]
@="Start google chrome and search for ____ website"
[HKEY_CLASSES_ROOT\*\shell\StartChrome\command]
@="cmd /min /c \"start chrome.exe 'http://subscene.com/subtitles/title?q=%~nx1'"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    相关资源
    最近更新 更多