windows - 如何让 HTA 自行重启?

标签 windows vba vbscript wmi hta

我有一个用于构建信息亭环境的 HTML 应用程序。在每个 session 结束时(当用户单击“注销”或超时后)我希望 HTA 自行关闭并重新启动*。我想知道如何使用 VBScript 以编程方式实现这一目标。

流程应该是这样的

  • 用户点击“注销”或者如果 5 分钟内没有输入
  • 删除临时互联网文件
  • 关闭 HTA
  • 重新打开 HTA

这是我遇到问题的重新打开部分。

我确实考虑过的一件事是;在关闭应用程序之前,设置一个只执行一次的计划任务以再次运行 HTA。不过,我认为这不是一个非常优雅的解决方案:(

谢谢大家的帮助!

干杯

伊恩


.* 我希望 HTA 自行重启的原因是,在长时间使用后,奇怪的事情开始发生,我认为这些事情与 mshta.exe 或 IE 引擎中的错误有关。我的 HTA 非常依赖动态创建的 IFRAME,并且出于某种原因,HTA 在它们关闭后无法正确清理它们。很难详细解释这个错误,但一个奇怪的例子是;我生成了一个新的 IFRAME,当我询问 DOM 时,一切看起来都应该如此,但浏览器呈现的是之前聚焦的 IFRAME 中的内容。

最佳答案

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

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

这里有一个小例子可以证明这一点。

这是一个简单的 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 设置并保持为我机器上的默认设置)。

关于windows - 如何让 HTA 自行重启?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3599384/

相关文章:

python - 通过解压缩到站点包中安装 Numpy

windows - 找不到包 "gopkg.in/validator.v2"错误

excel - 从 Run 获取函数的返回值

encoding - 如何从 VBScript 中的单个字符获取 UTF-8 编码

asp-classic - VBScript 条件短路解决方法

windows - 为什么 Windows 10 家庭版计算机管理中缺少本地用户和组?

windows - 退出调用另一个批处理脚本的批处理脚本

vba - 最好的风格是什么? '<>' 或 'not ='/VBA

excel - 使用 Excel VBA 获取工作表名称

cmd - 如何从命令行运行 VBScript