当前位置: 首页 > 图文教程 > 脚本技术 > VBScript > 在 HTA 中暂停脚本的方法

VBScript
用vbs脚本来关闭 HTML 页面的代码
用vbs实现确定是否安装了某个特定的补丁
用vbs确定用户的登录名的代码
用vbs找到映射到共享的所有驱动器并重新映射它们
可以从一台远程服务器运行 SP2 安装程序Install.vbs
用vbs判断一个日期是否在指定的时段内
vbs+hta中实现在单个 onClick 参数中包括多个子例程的代码
vbs中实现启动两个应用程序,一直等到其中一个程序结束,然后关闭另一个?
用vbs实现对文本文件中的项计数
用vbs对文本文件的内容进行排序
用vbscript把 Word 文档保存为文本文件的代码
用vbs返回 Internet Explorer 的下载控件和 Applet 的列表
用vbscript合并多个文本文件的代码
用vbscript防止本地用户更改其密码
用vbs针对一个 IP 地址范围运行脚本
用vbs 实现从剪贴板中抓取一个 URL 然后在浏览器中打开该 Web 站点
使用vbscript脚本在表单中进行选择的代码
一个把任何文件转成批处理的vbs脚本Any2Bat.vbs
windows脚本调试howto的方法
注册表的禁用与解锁方法集合

VBScript 中的 在 HTA 中暂停脚本的方法


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-11   浏览: 61 ::
收藏到网摘: n/a

问:
您好,脚本专家!如何在 HTA 中暂停脚本?
-- TJ
答:
您好,TJ。您知道,从古至今,人们已经花费了巨大的时间和精力来探索生命的意义。脚本专家却从未参与其中。为什么?好吧,先不说懒,我们知道那无关紧要:就算您的确找到了生命的意义,也没人在乎它。没人想知道我们存在的理由;相反,他们 - 同您一样 - 只想知道到底如何才能暂停一个嵌入在 HTML 应用程序 (HTA) 中的脚本。那才是脚本专家为之献身的事业。
现在,如果您不熟悉 HTA,您首先想到的可能是“使用 Wscript.Sleep 即可”。(顺便说一句,如果您不熟悉 HTA,可以浏览 HTA Developers Center(英文)。)这是个好主意,但却无法实现。为什么?因为 Wscript 对象是个稍微有些独特的对象;原因之一是您实际上并不能创建此对象的实例。而只要您运行在 Windows Script Host 之下,Wscript 即会自动为您提供。问题就在这里:当您在 HTA 内部运行代码时,您并没有运行在 Windows Script Host 之下。您其实是运行在 Internet Explorer 所提供的脚本宿主之下。因为您没有运行在 Windows Script Host 之下,因此您无法自动访问 Wscript 对象,而且因为您无法创建自己的 Wscript 对象,也就无法访问 Wscript.Sleep。用高科技术语来讲,就是“瘫痪”了。
如果 Internet Explorer 提供类似于 Wscript.Sleep 的方法,则这也不是什么大不了的问题;很不幸,它没有提供。那么是否有某种神奇的解决方法,我们可以使用它来代替 Sleep 方法呢?这有必要问吗?
点击运行可以看到效果:
[Ctrl+A 全选 提示:你可先修改部分代码,再按运行]

我们的 HTA 非常简单:它只由一个按钮组成,单击时会运行名为 Test 的子例程。很了不起,对不对?好吧,我们先看看 HTA 的 <SCRIPT> 部分,然后再确定它是不是真的很了不起。
我们在 <SCRIPT> 部分所做的第一件事就是声明一个名为 dtmStartTime 的全局变量:
Dim dtmStartTime
这其实对于暂停脚本没有任何作用;我们只是利用此变量帮助我们查看脚本是否的确象所期待的那样暂停。如果您现在还没有明白其含义,别急:很快就会清楚。
接下来是 Test 子例程,在我们单击按钮时调用它:
Sub Test
dtmStartTime = Now
idTimer = window.setTimeout("PausedSection", 5000, "VBScript")
End Sub
请注意,此子例程中仅有两行代码。在第一行中,我们只是将当前的时间和日期(使用 Now 函数)赋予变量 dtmStartTime。接下来是下面这行代码:
idTimer = window.setTimeout("PausedSection", 5000, "VBScript")
无论您相信与否,这就是我们实现 Sleep 方法函数的方式。我们使用 setTimeout 方法创建了一个定时器,其 ID 为 idTimer。正如您所看到的,我们将三个参数传递给 setTimeout:
? PausedSection。此参数为定时器到时后我们要运行的子例程的名称。
? 5000。此参数为在调用 PausedSection 之前我们希望定时器等待的时间(以毫秒计;5000 毫秒等于5 秒)。换句话说,这就是我们需要的暂停。如果需要将脚本暂停 30 秒,则可将此参数设置为 30000。
? VBScript。此参数是必需的,它只是告诉脚本 PausedSection 是用 VBScript 编写的。
即,我们单击按钮时,Test 子例程将运行。Test 子例程运行时,它将创建名为 idTimer 的定时器。idTimer 的唯一功能就是等待 5 秒然后调用子例程 PausedSection。明白了吗?好的。
那么子例程 PausedSection 执行什么操作?显然,我们可以运行任何希望的代码;简单起见,在此我们仅做两件事情。首先,显示一个消息框,它显示我们单击此按钮的时间及消息框自身实际显示在屏幕上的时间:
Msgbox dtmStartTime & vbCrLf & Now
若允许舍入误差,这两个时间的间隔应为 5 秒。这重要吗?当然重要。请记住,在 PausedSection 子例程内部首先发生的就是显示此消息框。如果此消息框在我们单击按钮 5 秒之后显示,则表明我们的脚本暂停了 5 秒。您可能会记起,这就是我们的最终目的。
我们在 PausedSection 子例程中要做的另外一件事情就是调用 clearTimeout 方法来有效地清除定时器:
window.clearTimeout(idTimer)
为什么这样做?原因很简单:定时器是设计为永远运行的。如果不清除定时器,每 5 秒钟 idTimer 就将调用 PausedSection 子例程一次,因此每 5 秒钟我们的这个小消息框就会在屏幕上弹出一次。我们真的不希望每 5 秒钟就看到这样的消息框,因此使用 clearTimeout 删除定时器。
我们承认,这确实不如使用 Wscript.Sleep 5000 那么简单;这表明在您启用和禁用定时器之前可能不得不稍稍掂量一番。因此,这或许带点挑战,但是,别忘了,这不也是生命的全部意义所在吗?
不,这不是一个反问句。正如我们所说,我们一直致力于暂停 HTA;除此之外,我们就不知道生命到底是什么了。