HTA中的外部VBScript
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTA中的外部VBScript相关的知识,希望对你有一定的参考价值。
我试图让我的HTA从外部位置加载脚本以节省我发布新的HTA文件,其中一些可以动态加载,因为我继续添加新功能。当我使用IIS在我的PC上本地托管脚本文件时,我可以使它工作。但是当我试图在外部托管它时(我到目前为止只尝试过GitHub),我收到以下错误:
- 线:1
- 四:1
- 错误:“类型不匹配:'您好'”
- 代码: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
我有两条建议给你。
首先,脚本未加载的原因是因为您将脚本指定为类型'txt'。这意味着当您通过本地/远程Web服务器提供脚本时,脚本的MIME类型将为“text / plain”,不会被接受。如果您将其重命名为正确的“vbs”扩展名,IIS将使用MIME类型“text / vbscript”来提供文件,这是HTA所期望的。
此外,以这种方式使用setTimeout是脆弱的,因为它要求您的脚本内容在100毫秒内成功加载。如果网络速度很慢,则呼叫将失败。最好只在您通过网络请求的脚本末尾调用Hello
。您可以重新调整setTimeout调用以检查脚本是否已在例如10秒(通过查找变量,可能?)并显示错误消息(如果没有)。请注意,在我的解决方案中,我已将主代码放在脚本标记之前,以便全局变量loaded
对远程脚本可见。
最后一个警告:在测试时,我发现HTA正在缓存VBS文件,因此当我对script.vbs进行更改时,它们在我重新加载应用程序时没有生效。你需要......
- 配置Web服务器以设置Expires标头,以便不缓存这些文件
- 在HTA文件中写一些代码来请求脚本后面带有'nonce'值,以覆盖缓存。例如,使用VBScript的
http://localhost/script.vbs?nonce=[RANDOM NUMBER]
和Randomize
函数请求Rnd
。请求具有这样的随机数的静态文件仍然可以在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>
script.vbs:
loaded = True
MsgBox("Hello.")
以上是关于HTA中的外部VBScript的主要内容,如果未能解决你的问题,请参考以下文章
ProgressBar 在 VBScript HTA 中没有得到刷新