如何使“URL协议”从其自身目录启动应用程序,而不是从c:\windows\system32启动?

3
我在系统中注册了一个URL协议,使用以下脚本启动批处理文件"showPath.bat"。
@echo off
reg add HKEY_CLASSES_ROOT\ProtoTest /t REG_SZ /d "My Description" /f
reg add HKEY_CLASSES_ROOT\ProtoTest /v "URL Protocol" /t REG_SZ /d "" /f
reg add HKEY_CLASSES_ROOT\ProtoTest\shell /f
reg add HKEY_CLASSES_ROOT\ProtoTest\shell\open /f
reg add HKEY_CLASSES_ROOT\ProtoTest\shell\open\command /t REG_SZ /d "C:\TestFolder\showPath.bat" /f

pause

"showPath.bat"文件的内容只是展示当前工作目录,即:

@echo off
SET var=%cd%
ECHO %var%
pause

如果我直接双击运行批处理文件,我可以正确看到它的路径。但是如果我使用上面注册的URL协议启动批处理文件,即在Chrome中浏览"ProtoTest://",批处理文件会运行,但显示路径为"C:\Windows\system32"而不是批处理文件的目录。因此,我认为使用URL协议启动的应用程序会以system32作为工作目录运行。现在,当从浏览器使用URL协议启动批处理文件时,如何使其从自己的目录运行--而无需修改批处理文件本身。只有URL协议可以从我的端口更改。

%CD% 返回当前工作目录,这与批处理脚本的父目录不同,您可以使用 %~dp0(包括尾部反斜杠)来检索它... - aschipfl
之前请先输入 cd /d "%~dp0" - Stephan
@Stephan,我无法修改批处理文件(第三方),如何更新URL协议,以便它使用正确的工作目录运行。上面给出的整个示例仅供理解。 - user1066231
1
这个怎么样:reg add HKEY_CLASSES_ROOT\ProtoTest\shell\open\command /t REG_EXPAND_SZ /d "%ComSpec% /C \"cd /D C:\TestFolder ^& call showPath.bat\"" /f - aschipfl
2
感谢您的答复,现在我明白为什么它可以工作了,似乎我忘记了reg add命令行中最外层的引号;您也可以使用REG_SZ类型,因为批处理文件已经展开了%ComSpec%(因为注册表键包含了对cmd.exe字面路径的引用)... - aschipfl
显示剩余6条评论
1个回答

4
以下代码对我有用。我的批处理文件放在一个带有空格的文件夹中,因此我除了转义字符之外还要添加 ""。但是它会像下面图片中显示的那样被添加到注册表中而没有转义字符。答案归功于@aschipfl。
@echo off
reg add HKEY_CLASSES_ROOT\ProtoTest2 /t REG_SZ /d "My Description" /f
reg add HKEY_CLASSES_ROOT\ProtoTest2 /v "URL Protocol" /t REG_SZ /d "" /f
reg add HKEY_CLASSES_ROOT\ProtoTest2\shell /f
reg add HKEY_CLASSES_ROOT\ProtoTest2\shell\open /f
reg add HKEY_CLASSES_ROOT\ProtoTest2\shell\open\command /t REG_EXPAND_SZ /d "%ComSpec% /C \"cd /D \"C:\Source\For Ref\URL Protocol\BatchTest\" ^& showPath.bat\"" /f

pause

enter image description here


启动程序后关闭cmd窗口是否可行? - Beetee
这个在Windows 10或Windows 7上能用吗?我现在在我的Windows 10电脑上测试了一下,但是失败了。 - OfusJK
如果我在Windows 10上运行它,它会弹出一个像这样的弹窗:https://i.imgur.com/fgCXItH.png。是否有任何预先步骤来启用此功能? - OfusJK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接