使用默认软件打开本地文件夹中的文件的自定义协议(通过Windows注册表) [英] Custom Protocol ( via Windows registry ) to open file in local folder and with default software
问题描述
请阅读下面我的答案
我想通过在Windows注册表中定义自定义URI方案,在他们的默认软件中单击一个HTML链接(在Chrome中)来打开本地文件。 对于注册表规则定义和我使用的链接,我尝试了许多不同的语法。 我的默认.reg文件如下所示:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT est]
"URL Protocol"=""
@="URL:test Protocol"
"DefaultIcon"=""C:\Windows\system32\notepad.exe",1"
[HKEY_CLASSES_ROOT estshell]
[HKEY_CLASSES_ROOT estshellopen]
[HKEY_CLASSES_ROOT estshellopencommand]
@=""C:\Windows\system32\notepad.exe" "%1""
我已经尝试了我能找到的%1、%*、"%1"和"%2"的所有示例...
目前,我只是尝试使用记事本,但最终我希望使用EXPLORER.EXE打开指定类型文件的默认软件。
我的HTML文件是:
<a href="test:C:test.txt">Open</a>
我已尝试测试://C:[...]、测试:/C:[...],并在文件路径中使用斜杠和反斜杠。
在上面的两个版本中,记事本会打开,但我会看到"文件名、目录名或卷标语法不正确"。(我将文件放在C盘根目录中,以确保避免任何特殊字符)另外,如果我定义文件的直接路径而不是参数字符串:@=""C:WindowsExplorer.exe""C:est.txt"",则文件打开时没有任何问题。
我做错了什么? 是否可以查看作为参数接收的字符串?
更新 我已经修改了注册表项,以使用ECHO命令调用一个简单的批处理文件("C:est.bat"%1),以查看收到的参数(ECHO%1暂停)。默认情况下,传递整个URI(例如:"test:c:est.txt")。 我发现如果我在方案后面加一个逗号,批处理文件就会收到两个参数:%1="test:"&;%2="C:est.txt"。 但注册表项值仍需要具有"%1"...
"%2"在到达批处理文件之前不包含任何内容。所以很遗憾,我不能直接调用‘"app.exe"%2’,而需要从.bat调用它,如果我找到解决方案,我会更新的。推荐答案
解决方案:
您可以定义一个注册表项来调用带有链接的href as参数的脚本:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT est]
"URL Protocol"=""
@="URL:test Protocol"
[HKEY_CLASSES_ROOT estshell]
[HKEY_CLASSES_ROOT estshellopen]
[HKEY_CLASSES_ROOT estshellopencommand]
@=""C:\Windows\Your-Script.bat" %1"
然后在-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);
这将启动默认应用程序并打开您的文件。
======================================================================
您可以使用简单的Java脚本函数,而不是复杂的批处理解析,以满足您的任何需要,例如,我在脚本中将所有斜杠替换为反斜杠。 您还可以使用自定义协议作为参数定义您的注册表项,并使用它来拆分。注册文件行:
@=""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>
使用:
@=""C:\Windows\Your-Script.bat" %2"
在您的脚本中:
wscript //E:JScript "%~dpnx0" %2
======================================================================
您的文件应使用您希望使用的任何Web浏览器在默认软件中打开。
如果您希望您的浏览器停止每次都要求您允许执行脚本(Chrome/Edge),您可以运行此reg文件:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESOFTWAREPoliciesMicrosoftEdge]
"ExternalProtocolDialogShowAlwaysOpenCheckbox"=dword:00000001
[HKEY_LOCAL_MACHINESOFTWAREPoliciesGoogleChrome]
"ExternalProtocolDialogShowAlwaysOpenCheckbox"=dword:00000001
[HKEY_LOCAL_MACHINESOFTWAREPoliciesChromium]
"ExternalProtocolDialogShowAlwaysOpenCheckbox"=dword:00000001
它将显示"记住"复选框。
这篇关于使用默认软件打开本地文件夹中的文件的自定义协议(通过Windows注册表)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!