如何通过 MATLAB 命令获取外部程序(由 MATLAB 调用)的 PID?
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
'
CreationDate
在 format 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'}
然后你可以根据第一列过滤。
我很好奇如何获取 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
'
CreationDate
在 format 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'}
然后你可以根据第一列过滤。