如何通过 MATLAB 命令获取外部程序(由 MATLAB 调用)的 PI​​D?

How to get the PID of an external program (invoked by MATLAB) via MATLAB commands?

我很好奇如何获取 MATLAB 调用的外部程序的 PID(在 Windows 中)。

例如,我通过命令 !notepad.exe[ 在 MATLAB 中调用记事本=18=]系统('notepad.exe')。我想在调用后立即获取此记事本的PID。

由于一台计算机上可能同时打开多个记事本,我需要获取它们各自的 PID(而不是进程名称)以跟踪它们。我不知道如何实施....

寻求帮助,在此先感谢!

创建一个 Powershell 脚本,findPid.ps1,包含以下内容:

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

上面的脚本获取有关 运行 notepad 进程的信息,按时间过滤它们并提取 pid。


从 MATLAB 执行非阻塞系统调用:

system('notepad.exe &')

调用 Powershell 脚本:

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

pids 是一个包含 notepad.exe 个进程(或多个进程)的 pids 的字符向量。

所以获取最近的pid:

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

不需要创建日期

可以调用Windows'tasklist command from Matlab using 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打开;西班牙语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       

     '

CreationDateformat 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'}

然后你可以根据第一列过滤。