2

我正在尝试在我的本地计算机上为 IE9 中的Sublime Text创建一个 Web 协议。我跟着微软在这里添加协议指南

不幸的是,我无法将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如果2文件是test 2.log. 这是start命令表现不正常的另一个实例,因为如果您查看我的批处理文件,我会将str变量括在引号中,因此应该保留空格。如果我在与 sublime 相同的目录中打开提示符并使用命令行 arg 运行 sublime,则c:\test 2.logsublime 正确打开只是test 2.log,不是test2所以我知道这是start命令的问题。

编辑:我应该补充一点,我也尝试过对路径进行 URL 编码,因为 MSDN 说 URI 不应包含特殊字符,但这也不起作用。

4

1 回答 1

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"

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

于 2012-12-26T16:10:57.597 回答