我试图从批处理文件中打开一个具有特定目标锚点的HTML文件,如下所示:
start iexplore %~dps0nl752.htm#01
exit
Run Code Online (Sandbox Code Playgroud)
nl753.htm 在当地的车道上.
如何让Windows在默认浏览器而不是Internet Explorer中使用目标锚点打开HTML文件?
如果你想启动默认浏览器,那么你显然不应该硬编码iexplore!start命令将根据文件扩展名或URL协议自行确定系统默认值.
在我的Windows 8.1机器锚上工作正常:
start "" "http://example.com#whatever"
Run Code Online (Sandbox Code Playgroud)
它确实似乎没有引号,但我个人更喜欢它们,以防有空间或&那里.
根据我的经验,Internet Explorer有时会在处理本地.htm [l]文件和/或file:// URL时进行某种内部重定向,这似乎剥离了锚点.你无能为力.
为了清楚起见,将锚附加到普通文件系统路径将不起作用,因为它在技术上改变了扩展.file:// URL将起作用,因为Windows仅在处理URL时查看协议.
在我的系统start "" "file:///C:/Program%20Files/Common%20Files/microsoft%20shared/Stationery/Soft%20Blue.htm#whatever"上工作,只要接受命令和启动浏览器.这并不意味着浏览器会尊重锚点,但这是您无法控制的浏览器中的实现细节,结果可能会因默认的浏览器而异.
如果这还不够好,那么您可以尝试使用IE Automation来启动和控制Internet Explorer.这意味着您必须放弃使用用户默认浏览器,因此我不推荐它...
依赖于file://协议和.html扩展来执行浏览器而不是HTML编辑器有点冒险,如另一个答案所指出的那样但是我不确定我是否敢于在批处理文件中查询注册表无论是.
绝对最佳的解决方案是使用强制progid调用ShellExecuteEx,但这只能在实际应用程序中使用.
第二个最佳解决方案是编写Windows Scripting Host脚本而不是批处理文件,因为在那里读取和解析注册表更安全...
在打开文件的情况下,使用file://和直接调用文件是一样的。
那是,
start "" "file://%cd:\=/%/myfile.html"
Run Code Online (Sandbox Code Playgroud)
是相同的
start "" "myfile.html"
Run Code Online (Sandbox Code Playgroud)
如果您打开 HTML 文件的默认程序是浏览器,这一切都很好,但也可能不是。
要使用浏览器,我唯一能想到的就是从注册表中获取它:
@echo off
setlocal EnableDelayedExpansion
for /F "tokens=3" %%i in ('reg query HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice /v ProgID') do for /F "tokens=2*" %%j in ('reg query HKEY_LOCAL_MACHINE\Software\Classes\%%i\shell\open\command /ve') do set cmd=%%k
start "" !cmd:%%1=file://%cd:\=/%/%1!
Run Code Online (Sandbox Code Playgroud)
解释一下,这会检索与“http”URL 模式的关联,然后查找该条目的执行命令并将其存储在 cmd 中。我们在这里使用 %%k 而不是 j 因为它可能包含空格,所以 2 (%%j) 从 reg 返回中选择第二个条目,然后将其余条目收集到 %%k 中。
然后它使用start调用cmd,目标文件(此处为%1)拼接到cmd中的%1中。我们假设传递的命令是相对的,并通过在它前面加上 %cd% 并将 \ 替换为 / 根据 URL 的需要,然后加上浏览器的文件架构作为前缀来使其成为绝对命令。
我不知道这有多强大,例如,每个系统的注册表地址都不同(我在 Win10 上这样做了)。