Как получить PID внешней программы (вызываемой MATLAB) с помощью команд MATLAB? - PullRequest
3 голосов
/ 15 октября 2019

Мне интересно, как получить PID внешней программы, вызываемой MATLAB (в Windows).

Например, я вызываю блокнот в MATLAB с помощью команды ! Notepad.exe или system ('notepad.exe') . Я хочу получить PID этого блокнота сразу же после его вызова.

Поскольку на одном компьютере могут быть одновременно открыты несколько блокнотов, мне нужно получить их соответствующие PID (вместо имени процесса), чтобы отслеживать их. Понятия не имею, как это можно реализовать ....

ищу помощи, заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 15 октября 2019

Дата создания не требуется

Вы можете вызвать команду Windows * tasklist из Matlab, используя system, а затем проанализировать результаты:

name = 'notepad.exe';
[~, s] = system(['tasklist /FI "imagename eq ' name '"']);
result = regexp(s, ['(?<=' strrep(name, '.', '\.') '\s*)\d+'], 'match');
result = str2double(result); % convert to numbers if needed

Результат system имеет следующий вид (открыты два окна «Блокнот»; испанская версия Windows):

>> s
s =
    '
     Nombre de imagen               PID Nombre de sesión Núm. de ses Uso de memor
     ========================= ======== ================ =========== ============
     notepad.exe                  12576 Console                    1    13,488 KB
     notepad.exe                  13860 Console                    1    13,484 KB
    '

Таким образом, регулярное выражение ищет цифры, которым предшествует имя программы инеобязательные пробелы, чтобы получить окончательный результат

>> result =
          12576       13860

Требуется дата создания

Если вам нужно фильтр на основе даты создания , вы можете использовать Windows 'wmic:

name = 'notepad.exe';
[~, s] = system(['wmic process where name=''' name ''' get ProcessId, CreationDate']);

Это дает строку, такую ​​как

s =
    'CreationDate               ProcessId  
     20191015151243.876221+120  6656       
     20191015151246.092357+120  4004       

     '

* CreationDate в формате yyyymmddHHMMSS+UUU, где +UUU или -UUU - это количество минут от UTC.

Вы можете разобрать s в массив строк, как указано ниже:

result = reshape(regexp(s, '[\d+\.]+', 'match').', 2, []).'; % 2 is the number of columns

Это дает

result =
  2×2 cell array
    {'20191015151243.876221+120'}    {'6656'}
    {'20191015151246.092357+120'}    {'4004'}

Затем вы можете фильтровать по первому столбцу n.

3 голосов
/ 15 октября 2019

Создайте скрипт Powershell, findPid.ps1 , содержащий следующее:

Get-Process | Where {$_.ProcessName -eq "notepad"} | Sort-Object starttime -Descending | Select 'Id'

Приведенный выше скрипт получает информацию о запущенных процессах блокнота, фильтрует их по времени и извлекаетpid.


Выполнение неблокирующего системного вызова из MATLAB:

system('notepad.exe &')

Вызов сценария Powershell:

[~,pids] = system('powershell -file findPid.ps1');

pids является вектором символов, содержащим pids процесса notepad.exe (или процессов).

Итак, чтобы получить самый последний pid:

pid = regexp(pids,'Id\n[^-]+--\n([0-9]+)','tokens','once')
...