我如何获得由cmd行生成的进程的pid

本文关键字:进程 pid 何获得 cmd | 更新日期: 2023-09-27 17:50:45

我想知道如何获得由cmd指令启动的进程的pid。

这里有一个例子

string instruction = "mpiexec FDTD.exe";
System.Diagnostics.ProcessStartInfo proInfo = new System.Diagnostics.ProcessStartInfo();
System.Diagnostics.Process pro = new System.Diagnostics.Process();
proInfo.FileName = @"cmd";
proInfo.CreateNoWindow = true; 
proInfo.UseShellExecute = false;
proInfo.RedirectStandardOutput = true;
proInfo.RedirectStandardInput = true;
proInfo.RedirectStandardError = true;
pro.StartInfo = proInfo;
richTextBox1.AppendText("FDTD Simulation Starts'n");
pro.Start();
pro.StandardInput.Write(temp + Environment.NewLine);
pro.StandardInput.Write(instruction + Environment.NewLine);
pro.StandardInput.Close();

根据上面的代码,我使用cmd行启动FDTD.exe。但是,我找不到获得FDTD.exe的pid的方法。

有人能帮我吗?

我如何获得由cmd行生成的进程的pid

您可以使用Process.GetProcessesByNameProcess.Id属性来获取PID。如果只有一个FDTD.exe在运行,这很简单:

int pid = Process.GetProcessesByName("FTDT").Single().Id;

如果有多个,你需要一些方法来选择最好的一个。我不知道确定的方法,但您的场景可能通过找到在正确时间启动的进程(Duration()获得TimeSpan的绝对值)来工作:

DateTime targetTime = DateTime.Now;
pro.StandardInput.Write(temp + Environment.NewLine);
pro.StandardInput.Write(instruction + Environment.NewLine);
pro.StandardInput.Close();
Process[] fdtdProcs = Process.GetProcessesByName("FTDT");
int pid = fdtdProcs
            .OrderBy(x => (x.StartTime - targetTime).Duration()).First().Id;

或记录前后的pid:

var pidsBefore = Process.GetProcessesByName("FTDT").Select(x => x.Id).ToList();
pro.StandardInput.Write(temp + Environment.NewLine);
pro.StandardInput.Write(instruction + Environment.NewLine);
pro.StandardInput.Close();
var pidsAfter = Process.GetProcessesByName("FTDT")
                       .Select(x => x.Id)
                       .Except(pidsBefore);
int pid = pidsAfter.Single();