Как получить список задач с параметрами запуска процесса
И еще про «устаревшие» технологии, которые можно (и даже нужно) перевести на современные рельсы. К примеру у меня долгое время работает утилита, которая получает список бекграунд-процессов на Windows-сервере и совершает с запущенными процессами некоторые действия — смотрит логи, проверяет — не завис ли процесс, запускает или останавливает его.
Как получался список программ и параметров запуска? Конечно же утилитой wmic (Windows Management Instrumentation) делался вывод в файл и он потом разбирался в цикле.
Теперь аналогичную задачу можно делать и с помощью .Net — намного легче читается код и нет форматированного ввода из потока.
USING System.*. USING System.Management.* FROM ASSEMBLY. &GLOBAL-DEFINE mqworker _progres.exe DEF VAR oProcess AS ManagementObject NO-UNDO. DEF VAR oEnumeration AS ManagementObjectCollection+ManagementObjectEnumerator NO-UNDO. DEF VAR oSearcher AS ManagementObjectSearcher NO-UNDO. DEF VAR oQuery AS SelectQuery NO-UNDO. oQuery = NEW System.Management.SelectQuery("Win32_Process","Name=~"{&mqworker}~""). oSearcher = NEW ManagementObjectSearcher(oQuery). oEnumeration = oSearcher:GET():GetEnumerator(). DO WHILE oEnumeration:MoveNext() = TRUE: oProcess = CAST(oEnumeration:Current,ManagementObject). MESSAGE "ProcessName: " oProcess:Item["Name"]:ToString() "," oProcess:Item["CommandLine"]:ToString() "," oProcess:Item["ProcessId"]:ToString() VIEW-AS ALERT-BOX. END.
Напомню, что использовать .Net-объекты из Windows-сессий можно только полноценно в v11. В версии 10.2B мы ограничены только prowin32 и WebClient-сессиями. Это означает, что сервер приложений в v10 .Net звать не может.
Для корректной работы данного примера нам необходимо сделать еще файл-манифест и положить его в свой PROPATH. Для примера запустим prowin.exe (или prowin32.exe) и пойдем в Tools -> Assembly References. Далее — File-> New и добавляем пространство System.Management в Assembly References и сохраняем результат в assemblies.xml