TestComplete: зависание при попытке использования Process.Terminate()

В одном из проектов мы столкнулись с ситуацией, когда 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.