HTA中的外部VBScript

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

我试图让我的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
vbscript hta
1个回答
0
投票

我有两条建议给你。

首先,脚本未加载的原因是因为您将脚本指定为类型'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.")
© www.soinside.com 2019 - 2024. All rights reserved.