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 的RandomizeRnd 函数。使用像这样的 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的主要内容,如果未能解决你的问题,请参考以下文章

HTA 中的 JavaScript 版本

HTA 中的另存为...对话框

HTA/VbScript - 下拉列表选项中的 If 语句

无线 HTA 中的 DAO 与 ADO

hta - Firefox、Chrome 中的等价物 - 这是旧技术吗?

HTA - 多HTA之间切换