Я новичок в написании сценариев Powershell и CMD и надеюсь, что вы можете помочь. Я запускаю код в R, который включает использование команды оболочки для запуска пакетного файла, который открывает и запускает процесс в другой программе, Quest Analytics. Я заметил, что это запускает процесс в моем диспетчере задач под названием «QuestConsole.exe». Quest что-то делает, затем сохраняет файл на мой диск C и должен закрыться. Однако он не всегда закрывается и остается зависшим, а использование памяти не показывает никаких изменений. R не запустит остальную часть моего кода, пока я не закрою процесс в диспетчере задач. У меня нет проблем с закрытием таким образом, и R затем без проблем продолжает работу с того места, где остановился. Я разрабатываю это для автономной работы через блестящее приложение, поэтому не смогу использовать диспетчер задач, чтобы закрывать его каждый раз, когда он зависает. Поэтому я решил попробовать создать сценарий Powershell, который непрерывно работает в фоновом режиме и убивает процесс QuestConsole.exe, если он был активен более 6 минут.
Я пробовал 2 разных подхода в Powershell:
(Get-WmiObject win32_process -Filter “name = ‘QuestConsole.exe’”).Terminate()
а также
Stop-Process -Name QuestConsole
Ни один из них не работает. Нет ошибки. Powershell ведет себя так, как будто все в порядке, но процесс QuestConsole.exe все еще находится в диспетчере задач (насмешка!).
Мне удалось заставить это работать в CMD:
Wmic process where name=”QuestConsole.exe” call terminate
Я предпочитаю использовать Powershell, потому что я уже написал свой скрипт, и процесс обучения был болезненным. Кто-нибудь знает другие способы убить мой процесс в PowerShell? Возможно, это эквивалент команды, которую я использовал в CMD? Кроме того, я включу свой скрипт Powershell на случай, если добрая душа поможет мне переписать его в CMD.
While ($True) {
$startTimeLimit = (Get-Date) - (New-TimeSpan -minutes 6)
$questStart = (Get-Process QuestConsole).StartTime
$eval = $questStart -gt $startTimeLimit
if ($eval -eq $false)
{
Stop-Process -Name QuestConsole
}
}
Нет веской причины, почему Stop-Process -Name QuestConsole
не должно работать.
Тем не менее, с прагматической точки зрения, если команда wmic.exe
работает для вас, просто вызовите ее из PowerShell.
Кроме того, вы не должны запускать свой скрипт мониторинга в замкнутом цикле — спите между проверками; следовательно:
While ($True) {
if (((Get-Date) - (Get-Process QuestConsole).StartTime).TotalMinutes -ge 6 {
wmic process where 'name = "QuestConsole.exe"' call terminate
}
Start-Sleep -Seconds 1
}
Обратите внимание на упрощенное условное выражение и '...'
вокруг аргумента фильтра wmic
, чтобы убедиться, что символы "
. проходят через.
Рад слышать, что это было полезно, @JupiterIo; Не за что.