Как правильно закрыть Internet Explorer при запуске из PowerShell?
Был набор недавно заданных вопросов о том, как что-то делать с Internet Explorer через PowerShell. Все они содержат коды для запуска IE из PowerShell как объекта через$ie=new-object -comobject InternetExplorer.Application
, Проблема в том, как правильнозакрытие IE, который состоит из вызова$ie.quit()
не работает - во-первых, если бы в этом IE было более одной открытой вкладки, то IE не закрывается в целом, и закрывается только вкладка, соответствующая COM-объекту, и, во-вторых, если он имеет только вкладка, окно закрывается, но процессы остаются.
PS > get-process iexplore
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
352 31 7724 24968 142 0,58 3236 iexplore
228 24 22800 15384 156 0,19 3432 iexplore
Я пытался исследовать методы, как закрыть процесс, начатый черезNew-Object -ComObject
и нашли это:Как избавиться от COMObject, Примером этого COMObject являетсяExcel.Application
который действительно ведет себя как задумано - звонитquit()
закрывает окно и выполняет[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ex)
если$ex
это созданный COMObject останавливает процесс Excel. Но это не относится к Internet Explorer.
Я также нашел этот вопрос:Как получить существующий COM-объект работающего IE который предоставляет код для подключения к IE через список открытых окон и работает в той степени, в которой IE запускается из другого места, но если COM-объект создается с помощью PowerShell, этот сценарий не сможет полностью остановить процессы IE, если он будет изменен следующим образом:
$shellapp = New-Object -ComObject "Shell.Application"
$ShellWindows = $shellapp.Windows()
for ($i = 0; $i -lt $ShellWindows.Count; $i++)
{
if ($ShellWindows.Item($i).FullName -like "*iexplore.exe")
{
$ie = $ShellWindows.Item($i)
$ie.quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ie)
}
}
В случае запуска IE вне PowerShell процессы останавливаются, но в случае запуска IE в PowerShell остаются два процесса, и этот код сообщает, что не обнаружил окон IE для доступа к COM-объектам, поэтому процессы IE (пока) не могут (пока) быть остановленным.
Итак, как добраться до явно осиротевших процессов IE без окон иизящно Останови их? Я в курсеGet-Process iexplore | Stop-Process
, но это остановит все без исключения IE, не только те, которые запускаются скриптом, и если скрипт запускается от имени администратора илиSYSTEM
скажем, на сервере удаленного рабочего стола все IE будут остановлены.
Среда: ОС Windows 7 x64, PowerShell 4 (установлена выше PS версии 2), IE11 версия 11.0.9600.17691 (автоматически обновляется). IE установлен на "Открыть домашнюю страницу" при запуске, поэтому всегда открыта хотя бы одна вкладка.