如何获取命令行生成的进程的pid?

时间:2014-03-18 16:57:04

标签: c# cmd pid

我想知道如何获取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。

1 个答案:

答案 0 :(得分:1)

您可以使用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();