我正在尝试在本地计算机上的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会分别尝试打开2
和test 2.log
。这是start
命令行为不稳定的另一个实例,因为如果查看我的批处理文件,我将str
变量包装在引号中,因此应保留空格。如果我在与sublime相同的目录中打开提示并使用命令行arg c:\test 2.log
运行sublime,则只需test 2.log
正确打开test
,而不是2
和start
,所以我知道它是{{1}}命令的问题。
编辑:我应该添加我也尝试过URL编码路径,因为MSDN说URI不应该包含特殊字符,但这也不起作用。
答案 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"
代字号~
将删除字符串中的任何周围引号(如果有)。