Windows - 启动命令和协议处理程序

时间:2012-12-26 01:28:53

标签: batch-file internet-explorer-9 protocols command-prompt dos

我正在尝试在本地计算机上的IE9中为Sublime Text创建一个Web协议。我跟着Microsoft's add a protocol guide here

不幸的是,由于协议command被附加到地址,我无法将sublime:密钥的注册表值直接链接到sublime。因此,如果我输入sublime:test.txt,则整个字符串将传递给sublime,而sublime不知道如何处理它。

因此,我制作了一个快速批处理文件来清理字符串subl.bat

@echo off
echo %1%
pause
set str=%1
set str=%str:sublime:=%
start "" CALL "C:\Program Files\Sublime Text 2\sublime_text.exe" "%str%"
echo %str%
pause

暂停仅用于调试,可以忽略。这个批处理文件只删除参数的sublime:部分,然后调用sublime传递已清理的参数。

现在,当我将command注册表项更改为:

“C:\ subl.bat”“%1”

然后在Internet Explorer中尝试,我收到错误file path not found。好吧,如果您尝试使用引号中的名称和引号中的参数使用start命令运行批处理文件,您实际上需要为窗口标题添加一个字符串,并在其后插入CALL命令,就像我的批处理文件一样。我的猜测是Internet Explorer正在使用start命令或类似的命令,并且因为两个参数都在引号中,所以它失败了。我已经尝试将值更改为:

"" CALL "C:\subl.bat" "%1"

CALL "C:\subl.bat" "%1"

但都没有奏效。但是,如果我删除%1周围的引号并且参数没有空格,则协议有效!一旦参数和程序有引号,它就会中断。

我真的想弄明白为什么我不能在程序路径和参数(用引号括起来)中编写带空格的协议处理程序。有人有什么想法吗?

如果要对此进行测试,则每次更改注册表项时都不需要重新启动计算机,因此很容易重现。

哦,该协议适用于Firefox,但如果文件为test,则sublime会分别尝试打开2test 2.log。这是start命令行为不稳定的另一个实例,因为如果查看我的批处理文件,我将str变量包装在引号中,因此应保留空格。如果我在与sublime相同的目录中打开提示并使用命令行arg c:\test 2.log运行sublime,则只需test 2.log正确打开test,而不是2start,所以我知道它是{{1}}命令的问题。

编辑:我应该添加我也尝试过URL编码路径,因为MSDN说URI不应该包含特殊字符,但这也不起作用。

1 个答案:

答案 0 :(得分:2)

从第一次阅读开始,似乎路径被误解了。这让我相信这是一个报价问题。 (因为批处理脚本喜欢引用[讽刺])我认为你需要很多周围的引用。

试试这个:(添加了代字号,第2行也不需要尾随%。) set变量周围的引号允许值中包含特殊字符。

@echo off
echo %1
pause
set "str=%~1"
set "str=%str:sublime:=%"
start "" CALL "C:\Program Files\Sublime Text 2\sublime_text.exe" "%str%"
echo %str%
pause

使用:(添加了代字号)

CALL "C:\subl.bat" "%~1"

代字号~将删除字符串中的任何周围引号(如果有)。