自定义协议(通过Windows注册表),以使用默认软件打开本地文件夹中的文件

问题描述 投票:0回答:1

请在下面阅读我的答案

我想通过在Windows注册表中定义一个自定义URI方案来单击HTML链接(在chrome中),以其默认软件打开本地文件。我为注册表规则定义和我使用的链接尝试了许多不同的语法。我的默认.reg文件如下所示:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\test]
"URL Protocol"=""
@="URL:test Protocol"
"DefaultIcon"="\"C:\\Windows\\system32\\notepad.exe\",1"

[HKEY_CLASSES_ROOT\test\shell]

[HKEY_CLASSES_ROOT\test\shell\open]

[HKEY_CLASSES_ROOT\test\shell\open\command]
@="\"C:\\Windows\\system32\\notepad.exe\" \"%1\""

我已经尝试过为%1,%*,“%1”“%2”找到的每个示例...现在,我只是在尝试使用记事本,尽管最终我想使用explorer.exe来打开指定类型文件的默认软件。

我的HTML文件是:

<a href="test:C:test.txt">Open</a>

我尝试过test:// C:[...],test:/// C:[...],并且文件路径中带有斜杠和反斜杠。

使用上述2个版本,记事本会打开,但我收到“文件名,目录名或卷标语法不正确。” (我将文件放在C驱动器根目录中,以确保避免任何特殊字符)

[此外,如果我定义文件的直接路径而不是参数字符串:@ =“ \” C:\ Windows \ explorer.exe \“ \” C:\ test.txt \“”,则文件打开时不会任何问题。

我在做什么错?有没有办法查看String作为参数接收?

UPDATE我已修改注册表项,以使用echo命令调用简单的批处理文件(“ C:\ test.bat”%1),以查看接收到的参数(echo%1暂停)。默认情况下会传递整个URI(例如:“ test:C:\ test.txt”)。我发现如果在方案后加逗号,则批处理文件将接收2个参数:%1 =“ test:”&%2 =“ C:\ test.txt”。但是注册表项值仍需要具有“%1” ...

“%2”在进入批处理文件之前不包含任何内容。因此,可悲的是,我无法直接调用'“ app.exe”%2',而需要从.bat调用它,如果找到解决方案,我会进行更新。

windows registry protocols local url-scheme
1个回答
0
投票

解决方案:

您可以定义一个注册表项,以使用链接的href作为参数来调用脚本:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\test]
"URL Protocol"=""
@="URL:test Protocol"

[HKEY_CLASSES_ROOT\test\shell]

[HKEY_CLASSES_ROOT\test\shell\open]

[HKEY_CLASSES_ROOT\test\shell\open\command]
@="\"C:\\Windows\\Your-Script.bat\" %1"

然后在Your-Script.bat中使用JScript拆分和解码URI:

@if (@This==@IsBatch) @then
wscript //E:JScript "%~dpnx0" %1
exit /b
@end
WScript.CreateObject("WScript.Shell").Run("explorer.exe " + decodeURIComponent(WScript.arguments(0).split("test:")[1]));
WScript.Quit(0);

这将启动默认应用程序并打开您的文件。

================================================= ======================

您可以根据需要使用简单的javascript函数,而不要使用奇怪的批处理语法,例如,我在脚本中将所有斜杠替换为反斜杠。您也可以使用自定义协议作为参数定义reg键,然后使用它来拆分。

reg文件行:

@="\"C:\\Windows\\Your-Script.bat\" %test:% %1"

脚本:

@if (@This==@IsBatch) @then
wscript //E:JScript "%~dpnx0" %*
exit /b
@end
WScript.CreateObject("WScript.Shell").Run("explorer.exe " + decodeURIComponent(WScript.arguments(1).split(WScript.arguments(0))[1]));
WScript.Quit(0);

如果您将链接的文件路径放在逗号之间,您甚至可以在不对协议进行硬编码或将其作为参数的情况下进行操作:

<a href="test:,C:test.txt,">Open</a>

with:

@="\"C:\\Windows\\Your-Script.bat\" %2"

并且在您的脚本中:

wscript //E:JScript "%~dpnx0" %2

================================================= ======================

您的文件应在您希望使用的任何网络浏览器中以默认软件打开。

[如果您希望浏览器不再要求您每次(Chrome / Edge)都允许脚本执行,则可以运行此reg文件:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge]
"ExternalProtocolDialogShowAlwaysOpenCheckbox"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome]
"ExternalProtocolDialogShowAlwaysOpenCheckbox"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Chromium]
"ExternalProtocolDialogShowAlwaysOpenCheckbox"=dword:00000001

它将显示“记住”复选框。

© www.soinside.com 2019 - 2024. All rights reserved.