HTA 中的外部 VBScript
Posted
技术标签:
【中文标题】HTA 中的外部 VBScript【英文标题】:external VBScript in a HTA 【发布时间】:2017-12-22 03:58:39 【问题描述】:我正在尝试让我的 HTA 从外部位置加载脚本以节省我发布新 HTA 文件的时间,其中一些可以在我继续向其中添加新功能时动态加载。当我使用 IIS 在我的 PC 上本地托管脚本文件时,我可以让它工作。但是当我尝试在外部托管它时(到目前为止我只尝试过 GitHub)我收到以下错误:
行:1 字符:1 错误:“类型不匹配:'Hello'” 代码:0 网址:我有类似的东西:
<html>
<HEAD>
<title>HTA Test</title>
<HTA:APPLICATION
SCROLL="yes"
SINGLEINSTANCE="yes"
WINDOWSTATE="maximize"
>
<script language="VBScript" src="http://localhost/HtaUpdates/script.txt"></script>
<SCRIPT Language=vbscript>
Sub Window_OnLoad
setTimeout "Hello", 100, "VBScript"
End Sub
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</html>
并在服务器上的 script.txt 中:
Sub Hello
MsgBox("Hello.")
End Sub
【问题讨论】:
脚本路径看起来很奇怪,因为它托管在 GitHub ...?src="http://localhost/..."
仅在您发布要使用在 localhost 上运行的网络服务器加载的文件时才有效。试试file:///
URL,或者简单的相对路径。
@Nathan 我已经给你详细的回答了。请让我知道它是否适合您,如果它解决了您的问题,请留下评论或将其标记为已接受。
【参考方案1】:
我有两个建议给你。
首先,脚本未加载的原因是您将脚本指定为“txt”类型。这意味着当您通过本地/远程 Web 服务器提供脚本时,脚本的 MIME 类型将是“文本/纯文本”,这将不被接受。如果您将其重命名为适当的“vbs”扩展名,IIS 将使用 MIME 类型“text/vbscript”提供文件,这正是 HTA 所期望的。
另外,以这种方式使用 setTimeout 是脆弱的,因为它要求您的脚本内容在 100 毫秒内成功加载。如果网络很慢,通话就会失败。最好在您通过网络请求的脚本末尾简单地调用Hello
。您可以重新调整 setTimeout 调用的用途以检查脚本是否已成功加载,例如10 秒(可能是通过查找变量?),如果没有,则显示错误消息。请注意,在下面的解决方案中,我将主代码 放在 脚本标记之前,以便远程脚本可以看到全局变量 loaded
。
最后一个警告:在测试时,我发现 HTA 正在缓存 VBS 文件,因此当我对 script.vbs 进行更改时,当我重新加载应用程序时它们没有生效。您需要...
配置 Web 服务器以设置 Expires 标头,这样这些文件就不会被缓存 在您的 HTA 文件中编写一些代码以请求脚本后带有“nonce”值,以覆盖缓存。例如请求http://localhost/script.vbs?nonce=[RANDOM NUMBER]
,使用VBScript 的Randomize
和Rnd
函数。使用像这样的 nonce 请求静态文件仍然可以在 IIS 上工作,因为参数被忽略 - 它只关心文件是否存在。
test.hta:
<html>
<HEAD>
<title>HTA Test</title>
<HTA:APPLICATION SCROLL="yes" SINGLEINSTANCE="yes" WINDOWSTATE="maximize">
<SCRIPT Language=vbscript>
Dim loaded : loaded = False
Sub CheckLoaded()
If loaded Then
MsgBox("Yes, the script loaded.")
Else
MsgBox("Oh dear! The script hasn't loaded.")
End If
End Sub
Sub Window_OnLoad
setTimeout "CheckLoaded", 1000, "VBScript"
End Sub
</SCRIPT>
<script language="VBScript" src="http://localhost/script.vbs"></script>
</HEAD>
<BODY>
</BODY>
</html>
脚本.vbs:
loaded = True
MsgBox("Hello.")
【讨论】:
在 raw.github.Testing 这样的网站上托管时更改文件扩展名似乎没有帮助,以确保在调用函数之前已加载外部文件是一个好主意,并且当我在使用我的本地 IIS 来托管文件。我会多做一些修补程序,看看我还能尝试什么。 @Nathan 当您请求原始文件时,您需要查看 Github 服务器返回的内容。如果 MIME 类型不是text/vbscript
,那么它根本不起作用,您需要托管一个可以这样做的解决方案。以上是关于HTA 中的外部 VBScript的主要内容,如果未能解决你的问题,请参考以下文章