您可能会发现这个问题的东西在我的答案(https://stackoverflow.com/a/3742182/128427)有用:How to get an HTA to restart itself?
它使用一个VBScript帮手等待进程结束(在HTA本身)然后重新启动HTA。您可以修改vbscript而不是等待特定过程结束(您的一个安装程序),然后将控制权返回给启动下一个安装程序并再次调用等待脚本的HTA。
我不认为HTA可以调用WScript.Sleep例程,但HTA中有setTimeout和setInterval方法,它们在X秒后调用例程,或者在每X秒后重复调用例程直到取消。您可以使用这些来定期检查进程是否仍在运行(使用WMI Win32_Process,如我在其他答案中所示)。
要处理这样的项目列表,而不是使用循环遍历列表并在每个项目后暂停,您需要一个中央状态机例程,每隔一段时间自行调用一次以提升系统性能。
'!! extremely "pseudo" pseudo-code follows
sub StartSystem()
state = "next program"
list = list of programs to install
AdvanceSystem()
end sub
sub AdvanceSystem()
if state = "next program"
if more items in list
start next installer
remove from list (or increment an index)
set state to "check program"
else
set state to "done"
if state = "check program"
use WMI to see if process is still running
if no
state = "next program"
if state <> "done"
setInterval(AdvanceSystem, 5000) ' call again in 5 seconds
end sub
' then somewhere in your HTA interface have a button to start things off
buttonClick = StartSystem()
使用这样的安排,你可能甚至不需要运行一个单独的VBScript来检查进程和睡眠。此外,通过这种增量式过程,您可以将输出发送到某处的DIV,以便用户可以看到进度,而在循环中处理事件时,只有在整个过程结束之前,输出才会显示出来。在每次通过AdvanceSystem后,控制权返回到HTA级别,系统可以自行更新。
让我知道如果你需要一个更具体的例子,我会尽量写点东西。
即使在浏览器控件中,您也应该可以使用CreateObject(“WScript.Shell”)创建shell对象。从该对象中,您可以访问Run,Exec或ShellExecute方法。就运行这些软件包而言,您需要咨询各个供应商。如果它们是MSI软件包,则使用msiexec.exe和/ qn!参数。 –