4

У меня есть некоторые запланированные задачи, которые открывают IE Windows в фоновом режиме для выполнения периодических процедур.

Проблема в том, что с течением дня несколько экземпляров IE остаются запущенными в фоновом режиме, и это оставляет меньше свободной памяти для работы на сервере.

Задачи настроены так, чтобы останавливать и уничтожать все еще работающие экземпляры при запуске, а также настраивать уничтожение экземпляров, работающих более 1 часа. Все это, кажется, не работает.

Я пытался включить JavaScript window.close() внизу страницы, но это не сработало. Я подозреваю, что это из-за настроек безопасности, которые спрашивают пользователя, когда неинтерактивные сценарии пытаются закрыть окно.

В: Есть ли способ закрыть эти окна после того, как они сделали это, автоматически?

Редактировать:

Это запланированные задачи в Windows Task Scheduler, который запускает Internet Explorer, напрямую передавая URL для открытия.

4 ответа4

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-адресов для поиска и закройте найденные окна.

Вы можете проверить это, открыв несколько вкладок в IE, открыв www.google.com и оставив другие в about:Tabs , запустите скрипт и посмотрите, как закрываются вкладки / окна.

Этот скрипт основан на найденном здесь.

1

Не полный ответ, но то, с чем можно надеяться поработать ...

Запланируйте новую задачу и используйте ее для запуска TaskKill в Windows и принудительного завершения всех процессов с именем образа «iexplorer.exe», которые выполнялись более часа:

Что-то вроде taskkill /F /IM iexplore.exe /FI "CPUTIME gt 1:00:00" .

1

Мое решение состоит в том, чтобы открыть браузер и закрыть его сразу после выполнения, но вызываемые сценарии должны быть изменены, чтобы выполнение не заканчивалось закрытием браузера.

Для этого в 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
0

Что за запланированное задание? Вы вызываете iexplore.exe напрямую или порождаете его в VBScript или как-то еще?

Если вы создаете его в VBScript, вам необходимо явно освободить объект ActiveX COM-сервера в коде VBScript до выхода из сценария, Set него значение Nothing .

Если не...

Это kluge (умный обходной путь, который не решает суть проблемы, но в любом случае решает ее), но ...

  • Напишите программу на вашем любимом языке программирования, которая порождает любой процесс, выполняющий ваши действия в IE, отслеживает идентификатор процесса в памяти и уничтожает его всякий раз, когда выполняется какое-либо "условие выхода". Затем вам просто нужно как-то сигнализировать окружению (запись в файл, отправка сообщения IPC или что-то в этом роде) из IE, что ваша обработка завершена, поэтому внешний процесс знает, что нужно убить IE. Затем во внешнем процессе используйте системный вызов TerminateProcess() для принудительного закрытия IE. Тогда он наверняка закроется, если только он не ожидает зависшего потока ядра, что, вероятно, связано с неисправностью драйвера устройства.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .