HTA调用外部VBScript,之后变为挂起模式。此时,控制转移到VBScript。由于VBScript代码执行,可能会重新启动计算机。重启后,HTA自动启动并保持挂起状态;而VBScript继续工作(让我们假设他们都从Startup开始)。完成VBScrip工作后,我想将控件转移回HTA并执行HTA子程序。假设这个子程序是Window_OnLoad。我怎样才能做到这一点?是否有开启HTA的指令,然后执行子程序?如果我使用Run方法(或ShellExecute)从VBScript启动到HTA,我只得到HTA窗口(你还记得HTA仍然被暂停)但我的目标是唤醒HTA并让它运行。
我不想在这里发布代码,因为这是一般性问题,代码可能会让人更加困惑......这个HTML应用程序的主要任务是为工作组/域的管理员提供一个非常流畅的方法来定制刚刚安装的Windows 7(更改计算机名称,加入域,设置本地计算机描述,设置域计算机描述,区域设置等)。 HTA还提供了选择要执行的步骤的机会 - 这是作为复选框列表实现的;以便管理员可以更改计算机名称,但不要将计算机包含在域中并设置电源设置。某些步骤需要重启计算机;但有些步骤可以将控制权传递给下一步而无需重启。这是一个大致的想法:我有HTA,允许用户输入一些数据;还有XML文件。 XML不仅用于保存用户数据,还用于保存步骤的一些指令;例如对于用户数据XML包含
<computername/>
<PCdescription/>
<DomainName/>
<OUName/>
虽然以这种方式描述了步骤:
<step>
<description>Include PC into Domain<description/>
<filetorun>/scripts/domain.vbs</filetorun>
<arguments></arguments>
<completion>reboot</completion>
</step>
此处description
是HTA窗口中显示的步骤名称,filetorun
提供要执行的VBScript(或批处理文件)以完成步骤,arguments
是从用户数据并保存到XML,complete
显示步骤完成后是否需要重新启动。
VBScript由这些指令执行:
strFile = oNode.SelectSingleNode("filetorun").Text
strArgs = oNode.SelectSingleNode("arguments").Text
stringtorun = strFile & " " & strArgs
result = Createobject("WScript.Shell").Run(stringtorun,,true)
其中oNode是当前步骤的XML节点。 所有指令都嵌套在HTA中,如此
<html>
<head>
'...........
<HTA:APPLICATION
APPLICATIONNAME="MyHTMLapplication"
VERSION="1.0"/>
'...............
</head>
<script language="VBScript">
Sub Window_OnLoad
'......................
' Populate form, save XML, other operations
'......................
'--------------execute step command---------------
strFile = oNode.SelectSingleNode("filetorun").Text
strArgs = oNode.SelectSingleNode("arguments").Text
stringtorun = strFile & " " & strArgs
result = oShell.Run(stringtorun,,true)
'-------------------------------------------------
If Reboot_is_not_required Then
'computer restart not required, proceeding with the next step...
Window_OnLoad
End If
End Sub
</script>
<body>
........................
</body>
</html>
截至目前,完成时允许采用两个值:重新启动和 NoReboot 。当前步骤完成后,后一个参数会导致 Window_OnLoad 的重复调用,我们即将进行下一步。 现在需要引入参数 Delay 。我将把这个参数用于需要系统重启的外部脚本,而不将控制权交还给HTA。
HTA在系统重启后自动启动。因此,如果当前步骤标记为延迟,则HTA将仅填充表单。我希望在这种模型中执行当前步骤的外部脚本会以某种方式将控制权传递给HTA。但这还不够,因为在这个阶段HTA的工作暂停了。要唤醒HTA并强制执行下一步,我需要调用子程序。如何从VBScript执行此操作?
对我不要太难。这是我编程的第一步。 提前谢谢。