1

Тема: AHK: Завершить скрипт, содержащий определённый параметр ком. строки

Есть ли возможность (autohotkey`но) завершить процесс скрипта, содержащего определённый параметр ком. строки, например:

"C:\Program Files\AutoHotkey_L\AutoHotkey.exe"  "D:\Scripts\L_CnctCtrl.ahk"

2

Re: AHK: Завершить скрипт, содержащий определённый параметр ком. строки

Только перебором всех процессов. Если нужен максимально короткий код, то через WMI:

For Process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process WHERE CommandLine LIKE '%calc%'")
   Process.Terminate(1)

Убьёт все процессы, содержащие в командной строке(включая и имя файла) подстроку "calc".

3

Re: AHK: Завершить скрипт, содержащий определённый параметр ком. строки

Спасибо!

4

Re: AHK: Завершить скрипт, содержащий определённый параметр ком. строки

Позвольте околопредметный вопрос
Есть ли источник где можно ознакомится с синтаксисом WQL? Желательно с примерами построения запросов и описанием доступной функциональности.

5

Re: AHK: Завершить скрипт, содержащий определённый параметр ком. строки

WMI and SQL и связанные темы.

6

Re: AHK: Завершить скрипт, содержащий определённый параметр ком. строки

Спасибо.

7

Re: AHK: Завершить скрипт, содержащий определённый параметр ком. строки

Апну тему, потому что нужно почти то же самое - закрывать приложения, запущенные со съемного диска.

Александр_ пишет:

Только перебором всех процессов. Если нужен максимально короткий код, то через WMI:

For Process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process WHERE CommandLine LIKE '%calc%'")
   Process.Terminate(1)

Убьёт все процессы, содержащие в командной строке(включая и имя файла) подстроку "calc".

Код отличный, но нет ли возможности вместо terminate попытаться сначала закрыть окно, (пробовал заменить на CloseMainWindow - не работает). Или как-то добыть из цикла PID процессов для закрытия через WinClose.

8

Re: AHK: Завершить скрипт, содержащий определённый параметр ком. строки

PID  — свойство ProcessId.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Завершить скрипт, содержащий определённый параметр ком. строки

teadrinker
И как им воспользоваться?
Так не работает

For Process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process WHERE ExecutablePath LIKE '%E:\%'")
   NN := Process.ProcessId

10

Re: AHK: Завершить скрипт, содержащий определённый параметр ком. строки

Обратный слеш нужно экранировать (удваивать).

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Завершить скрипт, содержащий определённый параметр ком. строки

Для закрытия окна пользуюсь этой функцией:

CorrectCloseProcess(WinTitle)
{
  loop,50
  {
    a++
    t:=a_tickcount
    SendMessage,WM_QUERYENDSESSION:=0x11,0,1,,% WinTitle
    d:=a_tickcount-t
    if (d>100)
      return -1
    b:=ErrorLevel
    SendMessage,WM_CLOSE:=0x10,,,,% WinTitle
    if (b="FAIL")
      return a
    sleep,10
  }
}

Возможно есть варианты лучше.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

12 (изменено: alex22, 2021-04-14 17:01:15)

Re: AHK: Завершить скрипт, содержащий определённый параметр ком. строки

teadrinker
Спасибо, теперь заработало, хотя и не так, как хотелось бы: если Process.Terminate завершает ВСЕ найденные в цикле for подходящие процессы, то в переменную записывается PID только верхнего процесса, поэтому пока не будет закрыт текущий процесс, следующий команду на закрытие не получит. Даже на небольших прогах, которые запустил для эксперимента, долго вышло, а в реальной работе предвижу секунд 20-30. Или все же придется убивать особенно долго завершающиеся процессы, чего не хотелось бы.

DetectHiddenWindows, on
Loop
{
NN = 0
For Process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process WHERE ExecutablePath LIKE '%E:\\%'")
   NN := Process.ProcessId(1)
if NN = 0
   break
WinClose, ahk_pid %NN%
;WinWaitClose,,, 5
;if ErrorLevel
;WinKill, ahk_pid %NN%
;Process, Close,%NN%
}

13

Re: AHK: Завершить скрипт, содержащий определённый параметр ком. строки

А зачем вы все процессы каждый раз заново в одну переменную записываете? И зачем там (1) ?
Но в любом случае придётся ждать, пока очередное окно закроется, если не примерить как-то многопоточность, ищите на форуме.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14

Re: AHK: Завершить скрипт, содержащий определённый параметр ком. строки

teadrinker пишет:

А зачем вы все процессы каждый раз заново в одну переменную записываете? И зачем там (1) ?

Зачем (1) понятия не имею, так в образце было. Процессы в переменную пишу чтобы в что в WinClose передать, как по другому?

15

Re: AHK: Завершить скрипт, содержащий определённый параметр ком. строки

Так вы записываете каждый раз в одну переменную по очереди все процессы, а передаёте только самый последний записанный.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16

Re: AHK: Завершить скрипт, содержащий определённый параметр ком. строки

По-другому не умею. Пробовал

For Process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process WHERE ExecutablePath LIKE '%E:\\%'")
   WinClose, ahk_pid %Process.ProcessId%

Получил ошибку.

17

Re: AHK: Завершить скрипт, содержащий определённый параметр ком. строки

Знаками процента можно обрамлять только одну переменную. Но ещё можно так записать:

For Process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process WHERE ExecutablePath LIKE '%E:\\%'")
   WinClose, % "ahk_pid" . Process.ProcessId
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

18

Re: AHK: Завершить скрипт, содержащий определённый параметр ком. строки

teadrinker пишет:

Знаками процента можно обрамлять только одну переменную. Но ещё можно так записать:

For Process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process WHERE ExecutablePath LIKE '%E:\\%'")
   WinClose, % "ahk_pid" . Process.ProcessId

Попробовал. Ошибку не выдаёт, но и программы не закрывает.