Работа с процессами
FOR-PROCS: "proc_pattern" <...> ;FOR-PROCS
Специальный цикл, который позволяет обрабатывать не только отдельные процессы, но и целые группы процессов, подпавших под указанную маску: для каждого подходящего процесса будут выполнены команды, заданные в теле цикла FOR-PROCS:.
Работает это так: если, например, под определенную маску подпали пять процессов, то цикл FOR-PROCS: автоматически будет запущен пять раз, причем при каждом запуске будет обновлено значение переменных %FOUND-PROC% и %FOUND-PID%, которые содержат имя найденного процесса и его Process ID (PID) соответственно.
Пример:
#( test_for_processes \ выводим на консоль имена всех запущенных процессов NoActive Action: FOR-PROCS: "*.exe" FOUND-PROC TYPE CR ;FOR-PROCS )#
Значит, при каждом цикле вы получаете доступ к PID и имени очередного процесса, подпадающего под указанную маску. Вам остается только выполнить над этим процессом нужное действие (прервать, присвоить нужный приоритет и т. д.) или же предпринять новую проверку, чтобы решить, как именно поступить с данным процессом.
Пример:
#( test_for_processes1 \ выводим запрос и прерываем по очереди \ все найденные процессы "ИЭксплорера" NoActive Action: FOR-PROCS: "iexplore.exe" QUERY: "Прервать процесс %FOUND-PROC%?" IF KILL: "%FOUND-PID%" THEN ;FOR-PROCS )#
KILL: "proc_pattern"
Прерывает работу указанного процесса. Принимает в качестве аргумента маску имени процесса (обычно это имя исполняемого файла, который запускает нужный нам процесс) или строку с числовым идентификатором процесса (Process ID), который помещается во предопределенную переменную PROC-ID сразу после запуска программы.
Использование Process ID позволяет прервать работу конкретного процесса даже в случае, когда запущено несколько копий одной программы, т. е. несколько процессов носят одно имя. Обратите внимание, что переменная PROC-ID заполняется после каждого успешного запуска программы с помощью START-APP, START-APPW или QSTART-APP, но использовать PROC-ID совместно с START-APPW не имеет смысла, т. к. в этом случае переменная хранит идентификатор процесса, который уже завершил работу.
Совместно с KILL: можно также использовать предопределенную переменную %WATCH-PROC-ID%, которая заполняется после применения слов WatchProc:/WatchProcStop: и содержит строку с идентификатором "отловленного" процесса (PID).
Примеры:
\ работаем с именем процесса KILL: "opera.exe" KILL: "notepad.exe" KILL: "*pad.exe" \ работаем с Process ID KILL: "2121" KILL: "%PROC-ID%" #( test_proc_id NoActive VARIABLE my_notepad_id Action: START-APP: notepad.exe PAUSE: 1000 START-APP: notepad.exe PROC-ID my_notepad_id ! PAUSE: 1000 START-APP: notepad.exe \ ... smth useful here \ прерываем работу Ноутпада, стартовавшего вторым KILL: "%my_notepad_id @%" )#
Существует также постфиксный вариант этого слова:
S" opera.exe" KILL S" 2121" KILL
Постфиксное слово, которое прерывает процесс по его PID. kill принимает число в качестве аргумента, поэтому вам не придется конвертировать число, которое возвращает PROC-ID или WATCH-PROC-ID в строку:
386 kill PROC-ID kill my_proc_id @ kill
PROC-TIME: "proc_pattern"
Кладет на стек время работы указанного процесса в секундах.
Работает только WinNT/2000/XP.
Кладет на стек время работы указанного процесса в миллисекундах (возвращает число двойной длины). Принимает PID в качестве аргумента.
Пример:
#( test_procactivetime NoActive Action: S" notepad.exe" PROC-EXIST? ?DUP IF \ выводим время работы notepad на консоль ProcActiveTime D>S . CR ELSE MSG: "Notepad is not started!" THEN )#
PROC-EXIST: "proc_pattern"
Возвращает флаг TRUE (-1), если процесс, подпадающий под маску существует. В качестве аргумента к слову PROC-EXIST: обычно используется имя исполняемого файла, который запускает процесс.
Пример:
Rule: PROC-EXIST: "winword.exe"
Можно идентифицировать процесс не только по имени исполняемого файла, но и по полному пути приложения. Для этого используйте опцию PROC-FULLPATH. Идентификация процесса по полному пути приложения происходит также если в имени процесса присутствует хотя бы один обратный слеш ('\').
Пример:
Rule: PROC-FULLPATH PROC-EXIST: "C:\PROGRAM FILES\OPERA\opera.exe"
Rule: PROC-EXIST: "C:\PROGRAM FILES\OPERA\opera.exe"
Если нужно узнать PID процесса, воспользуйтесь постфиксным словом PROC-EXIST?
Пример:
\ кладет на стек PID 'winword.exe' S" winword.exe" PROC-EXIST?
PROC-FULLNAME ( pid
- a u)
PROC-NAME ( pid - a u)
Постфиксные слова, которые возвращают строку, содержащую полное/короткое имя процесса по его PID. Слово PROC-NAME возвращает имя исполняемого файла (скажем, notepad.exe), а PROC-FULLNAME возвращает имя процесса, вместе с путем к исполняемому файлу (c:\windows\system32\notepad.exe).
Пример:
#( test_procname WatchProc: "notepad.exe" Action: \ выводим короткое имя процесса на консоль: WATCH-PROC-ID PROC-NAME TYPE CR \ выводим полное имя процесса в сообщении: MSG: "%WATCH-PROC-ID PROC-FULLNAME%" )#
Постфиксное слово, которое приостанавливает работу задачи до тех пор, пока указанный процесс не станет idle. Основная сфера применения - дождаться завершения загрузки программы, запущенной с помощью START-APP:.
Пример:
#( test_start_app NoActive Action: START-APP: your_prog.exe \ приостанавливаем задачу до полной загрузки your_prog.exe PROC-ID PROC-WAIT-IDLE \ продолжаем работу задачи \ ... )#
proc_pattern - это
имя процесса или маска имени процесса. Обычно имя процесса - это имя исполняемого
файла, который запускает интересующий нас процесс. Задавая маску имени или полного
пути процесса можно применять символы '*' и '?' или регулярные
выражения, заключив их в прямые слеши: /<regexp>/.
В качестве имени процесса можно указывать не только имя исполняемого файла,
но и полный путь к нему. Маска сравнивается с полным путем исполняемого файла,
если в ней присутствует хотя бы один обратный слеш ('\').
Также в proc_pattern можно использовать идентификатор процесса (см.
PROC-ID, %WATCH-PROC-ID%).
Примеры:
\ имя процесса PROC-EXIST: "notepad.exe" \ маска имени процесса PROC-EXIST: "notepad*"
PROC-EXIST: "*pad.exe" \ маски имени процесса с учетом пути к исполняемому файлу PROC-EXIST: "*\notepad*" PROC-EXIST: "c:\*\notepad.exe" \ регулярное выражение PROC-EXIST: "/(note)|(word)pad.exe/i" \ идентификатор процесса PROC-EXIST: "1116"
PROC-EXIST: "%WATCH-PROC-ID%"
PROC-EXIST: "%my_proc_id @%"
См. также: