如何使用进程运行多个命令

时间:2015-05-18 21:43:16

标签: c# process exit-code

我有一个进程,用它来运行几个命令。

Process mycmd = new Process();

    mycmd.StartInfo = startInfo1;
    mycmd.Start();
    if (mycmd.ExitCode > 0)
    {
    // do something
    }
    mycmd.StartInfo = startInfo2;
    mycmd.Start();
    if (mycmd.ExitCode > 0)
    {
    // do something else
    }

第一次执行命令时,exitcode为1.它也会在第二次运行时保存。如何重置退出代码? 其他问题是 - 可以两次打电话给“开始”吗?

1 个答案:

答案 0 :(得分:2)

每次在var p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.Start(); p.WaitForExit(); var exitCode = p.ExitCode; Console.WriteLine("Handle: {0}, PID: {1}, Exit code: {2}", p.Handle.ToInt32(), p.Id, exitCode); p.StartInfo.FileName = "cmd.exe"; p.Start(); p.WaitForExit(); exitCode = p.ExitCode; Console.WriteLine("Handle: {0}, PID: {1}, Exit code: {2}", p.Handle.ToInt32(), p.Id, exitCode); 实例上调用Handle: 1308, PID: 9060, Exit code: 1 Handle: 1324, PID: 8428, Exit code: 2 时,都会创建一个新进程,系统会为其分配资源。这些资源是进程句柄和其他属性,如退出代码和退出时间。如果你写的东西如下:

ExitCode

并使两个进程返回不同的值(通过键入命令窗口,例如退出1 退出2 ),您将获得类似于此的输出:

Handle

ProcessIDisposable等流程属性正确返回上次终止流程的值。但是它们在之前运行的进程中丢失了,并且还有资源泄漏,因为尚未处理为先前进程分配的系统资源(以下引用来自MSDN):

  

如果某个句柄对该进程开放,则操作系统会释放该句柄   进程退出时处理内存,但保留管理   有关进程的信息,例如句柄,退出代码和退出   时间。要获取此信息,可以使用ExitCode和ExitTime   属性。这些属性会自动填充进程   这个组件启动了。行政信息是   与所有与之关联的Process组件时释放   系统进程被破坏,并且不再保留已退出的句柄   过程

Close()类型实现Dispose()接口,当您在Process实例上调用Process(或Dispose())时,这些组件将被销毁(以下引用为来自MSDN):

  

Close方法会导致进程停止等待退出   等待,关闭进程句柄,并清除特定于进程的进程   属性。 (...)Dispose方法调用Close。放置流程   使用块中的对象处理资源而无需调用   关闭。

使用using (var p = new Process()) { p.StartInfo.FileName = "cmd.exe"; p.Start(); p.WaitForExit(); var exitCode = p.ExitCode; Console.WriteLine("Handle: {0}, PID: {1}, Exit code: {2}", p.Handle.ToInt32(), p.Id, exitCode); } using (var p = new Process()) { p.StartInfo.FileName = "cmd.exe"; p.Start(); p.WaitForExit(); var exitCode = p.ExitCode; Console.WriteLine("Handle: {0}, PID: {1}, Exit code: {2}", p.Handle.ToInt32(), p.Id, exitCode); } 运行两个流程的正确方法包括调用{{1}}:

{{1}}