如何让HTA重新启动?

我有一个HTML应用程序,我正在使用它来构build一个信息亭环境。 在每个会话结束时(当用户点击“注销”或超时后),我希望HTA自己closures并重新启动*。 我想知道如何用VBScript来实现这个编程。

这个过程应该是这样的

  • 用户点击“注销”或5分钟内没有input
  • 删除临时的Internet文件
  • closuresHTA
  • 重新打开HTA

这是我遇到麻烦的重新开放的一部分。

我考虑的一件事是; 在closures应用程序之前,请设置一次只调度的任务以再次运行HTA。 我不认为这是一个非常优雅的解决scheme,虽然:(

谢谢你们的帮助!

干杯

伊恩


。*我想让HTA自行重启的原因是,经过长时间的使用,奇怪的事情开始发生,我认为这与mshta.exe或IE引擎中的错误有关。 我的HTA很大程度上依赖于dynamic创build的IFRAME,由于某些原因,HTA在closures后不能正确清理它们。 这个错误很难详细地解释,但是这个怪事的例子是, 我产生了一个新的IFRAME,当我询问DOM时,一切看起来都应该如此,但是浏览器呈现的是以前聚焦的IFRAME中的内容。

当注销或超时时,HTA运行重启脚本,然后退出。 重新启动脚本等待MSHTA进程消失,然后重新启动并退出。

这可以通过使用WMI扫描正在运行的进程并查找MSHTA.EXE的实例来完成,该实例的命令行参数包含HTA的名称。

这里有一个小例子来说明这一点。

这是一个准系统HTA,将其另存为RestartTest.hta:

<html> <!-- RestartTest.hta --> <head> <title>Self Restarting HTA Test</title> <script language="VBScript"> sub RunApp(sApp) CreateObject("WScript.Shell").Run(sApp) end sub sub LogOff() RunApp "cscript.exe RestartHTA.vbs" MsgBox "simulating delayed exit - click to close" window.close() end sub </script> </head> <body > <input type="button" value="Log off" onClick="LogOff()" /> </body> </html> 

这是重新启动脚本,另存为RestartHTA.vbs:

 ' RestartHTA.vbs' ' wait until RestartTest.hta is not running and restart it.' MSHTA = "mshta.exe" sHTA = "RestartTest.hta" say "waiting for process " & MSHTA & " with param " & sHTA & " to end" secs = 2000 bRunning = vbTrue do while bRunning if ProcessRunning(MSHTA, sHTA) then say "still running, wait a few seconds" WScript.Sleep secs else bRunning = vbFalse end if loop say "HTA not found, proceding to restart" WScript.Sleep secs CreateObject("WScript.Shell").Run(sHTA) WScript.Quit '---' function ProcessRunning(sProcess, sParam) set oWMI = GetObject( _ "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") set cProcs = oWMI.ExecQuery( _ "select * from Win32_Process where Name = '" & sProcess & "'") bFound = vbFalse for each oProc in cProcs say oProc.Name & ": " & oProc.CommandLine if (InStr(oProc.CommandLine, sParam) > 0) then say "found" bFound = vbTrue else say "wrong param" end if next ProcessRunning = bFound end function sub Say(s) WScript.Echo s end sub '===' 

你可以运行任意一个开始循环,然后用X按钮关闭HTA来分解它。 请注意,我明确地用CScript运行重启脚本。 这只是为了演示目的,显示它的控制台输出(因为我出于某种原因,在我的机器上设置和保留CScript作为默认设置时遇到问题)。

看看下面的代码:

 <html> <title>HTA Restart</title> <head> <HTA:APPLICATION Id="oHTA" Border="thick" InnerBorder="no" Scroll="no"/> </head> <script language="vbscript"> Sub Restart() CreateObject("WScript.Shell").Run "mshta " & oHTA.commandLine window.close End Sub </script> <body style="background-color: buttonface;"> <input type="button" value="Logout" onclick="Restart()" /> </body> </html>