如何使用process来运行几个命令

本文关键字:几个 命令 何使用 process 运行 | 更新日期: 2023-09-27 17:49:34

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

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。它也为第二次运行保存。如何重置退出码?另一个问题是,两次调用"start"可以吗?

如何使用process来运行几个命令

每次在Process实例上调用Start()时,都会创建一个新进程并为其分配资源。这些资源是进程句柄和其他属性,如退出代码和退出时间。如果你这样写:

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);

并使两个进程返回不同的值(通过在Windows命令中分别输入exit 1exit 2),您将得到类似于下面的输出:

Handle: 1308, PID: 9060, Exit code: 1
Handle: 1324, PID: 8428, Exit code: 2

进程属性如ExitCodeHandle正确返回最后终止进程的值。但是它们在之前运行的进程中丢失了,并且您也有资源泄漏,因为为前一个进程分配的系统资源尚未被处置(以下引用来自MSDN):

如果一个句柄对进程打开,操作系统释放进程退出时的进程内存,但保留管理内存有关进程的信息,如句柄、退出代码和退出时间。为了获得这些信息,您可以使用ExitCode和ExitTime属性。这些属性是为进程自动填充的都是由这个分量开始的。管理信息为发布时,所有与之关联的Process组件系统进程被销毁,并且不再持有退出的句柄过程。

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

Close方法导致进程停止等待退出(如果它是)等待,关闭进程句柄,并清除进程特定的属性。(…)Dispose方法调用Close。放置过程对象在using块中处置资源而不需要调用关闭。

使用Process运行两个进程的正确方法包括调用Dispose():

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);
}