我想知道如何获取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的方法。
有人能帮帮我吗?
提前thx。答案 0 :(得分:1)
您可以使用Process.GetProcessesByName
和Process.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();