В одном из проектов мы столкнулись с ситуацией, когда TestComplete зависал при попытке воспользоваться методом Process.Terminate(). В индикаторе висело сообщение Waiting for PROCNAME, а сам TestComplete просто чего-то ждал. Единственное решение — закрыть этот процесс вручную с помощью Task Manager, однако для автоматических запусков такой способ, естественно, не подходит. Решение было достаточно простым: мы воспользовались утилитой taskkill.exe, которая входит в состав Windows.
Вот пример кода на JScript:
function killProcs(){ for(var i = 0; i < arguments.length; i++){ if(arguments[i].slice(-4) != '.exe' && arguments[i].slice(-1) != '*'){ arguments[i] += '.exe'; } Log.Message('Killing process ' + arguments[i]); Win32API.WinExec('taskkill /f /im ' + arguments[i], SW_HIDE); } }
Утилита taskkill.exe либо принимает полное имя процесса с расширением (.exe), либо можно воспользоваться символом групповой замены (*) для замены части имени. Чтобы не думать каждый раз о необходимости использования расширения, мы проверяем, передано ли оно в аргументе, если нет — добавляем (кроме тех случаев, когда в конце стоит символ групповой замены). Кроме того, мы используем параметр /f (принудительное завершение процесса).
Саму команду мы выполняем с помощью Win32API.WinExec, в том числе используя параметр SW_HIDE, чтобы при выполнении команды на пару секунд не появлялось окно консоли.
Теперь можно легко и быстро завершить сразу несколько процессов, причем их имена можно передавать несколькими способами:
function testKill(){ killProcs('notep*', 'mspaint', 'excel.exe'); }
В данном случае будут закрыты все процессы, начинающиеся на notep (например, notepad.exe, notepad++.exe), процесс mspaint.exe и excel.exe.
Конечно, необходимо помнить, что закрыть таким образом получится только процессы, чей приоритет запуска такой же, как у TestComplete или ниже. Например, если вы просто запустили TestComplete (даже из-под администраторской учётной записи), вы не сможете завершить процесс, запущенный с помощью опции Run as Administrator.