我有一些计划任务,会在后台打开 IE Windows 来执行定期例行任务。
问题是,随着时间的推移,多个 IE 实例在后台执行,这会导致服务器上可用的内存减少。
任务配置为在启动时停止并终止仍在运行的实例,还配置为终止运行时间超过 1 小时的实例。所有这些似乎都不起作用。
我尝试window.close()
在页面底部添加 JavaScript,但没有成功。我怀疑这是因为安全设置会在有非交互式脚本试图关闭窗口时询问用户。
问: 有没有办法在这些窗口自动完成工作后将其关闭?
编辑:
这些是 Windows 任务计划程序中的计划任务,它通过传递要打开的 URL 直接执行 Internet Explorer。
答案1
以下 VBScript 将枚举所有窗口,找到与您想要查找的 URL 匹配的窗口,然后关闭选项卡/窗口。
Set sa = CreateObject("Shell.Application")
Set windows = sa.Windows()
For Each window In sa.windows
If left(window.LocationUrl, 5) <> "file:" Then
' logic for selecting windows goes here
If InStr(window.locationUrl,"www.google.com") Then window.Quit()
If UCase(window.locationUrl) = UCase("about:tabs") Then window.Quit()
End If
Next
部分If InStr
可用于进行部分 URL 搜索,而部分If UCase
可用于进行精确字符串比较。请进行相应调整。修改脚本应该不会太难,只需向其传递一个包含要搜索的 URL 列表的文本文件并关闭找到的窗口即可。
www.google.com
您可以通过在 IE 中打开多个选项卡、打开并保留其他选项卡about:Tabs
、执行脚本并观察选项卡/窗口关闭来对其进行测试。
此脚本基于一个找到这里。
答案2
这不是一个完整的答案,但希望您可以使用它......
安排新任务并使用它来启动 Windows'任务终止,并强制终止所有运行时间超过一小时,且镜像名称为“iexplorer.exe”的进程:
就像是taskkill /F /IM iexplore.exe /FI "CPUTIME gt 1:00:00"
。
答案3
我的解决方案是打开浏览器,并在执行后立即关闭,但调用的脚本应该进行修改,以便执行不会因关闭浏览器而结束。
为此,在 PHP 中,您可以在脚本顶部添加此代码,这样浏览器状态就不会影响 PHP 执行状态:
// So execution is triggered but can be aborted by closing the browser
ignore_user_abort(true);
// Even if closing browser has no more effect, time limit should be set to
set_time_limit(300);
然后,在计划的 Windows 批处理中,您可以执行
REM Call it
START http://.../mycode.php
REM Wait a little
ping 127.0.0.1 -n 6 > nul
REM Kill Them All
TASKKILL /F /IM iexplore.exe
答案4
什么样的计划任务?您是直接调用 iexplore.exe,还是在 VBScript 或其他程序中生成它?
如果您在 VBScript 中生成它,则需要在脚本退出之前通过Set
将其设置为 来明确释放 vbscript 代码中的 COM 服务器 ActiveX 对象Nothing
。
如果不...
这是一个权宜之计(一种巧妙的解决方法,虽然不能解决问题的根源,但无论如何都能解决问题),但是......
- 用您最喜欢的编程语言编写一个程序,该程序会生成执行 IE 操作的任何进程,跟踪内存中的进程 ID,并在满足某些“退出条件”时将其终止。然后,您只需从 IE 内部以某种方式向环境发出信号(写入文件、发送 IPC 消息或类似操作),表明您的处理已完成,这样外部进程就知道要终止 IE。然后,在外部进程中,使用系统
TerminateProcess()
调用强制关闭 IE。它肯定会关闭,除非它正在等待挂起的内核线程,这可能是由于设备驱动程序故障造成的。