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

Posted

技术标签:

【中文标题】如何使用进程运行多个命令【英文标题】:How to use process to run several commands 【发布时间】:2015-05-18 21:43:15 【问题描述】:

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

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
    

第一次执行命令时,退出代码为 1。它也被保存以供第二次运行。如何重置退出代码? 另一个问题是 - 可以调用两次“开始”吗?

【问题讨论】:

我相信您可能想要启动一个新进程,而不是在同一进程上使用一组新的启动信息。 同意@ZackCampbell,允许Start 被调用两次似乎是一个设计缺陷。 【参考方案1】:

每次在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);

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

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

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

如果一个句柄对进程开放,操作系统会释放 进程退出时的进程内存,但保留管理 有关进程的信息,例如句柄、退出代码和退出 时间。要获取此信息,您可以使用 ExitCode 和 ExitTime 特性。这些属性是为进程自动填充的 由该组件启动。行政信息是 当所有与 系统进程被销毁并且不再持有退出的句柄 过程。

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

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

【讨论】:

以上是关于如何使用进程运行多个命令的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中为多个进程提供单个命令窗口

当使用 Java 命令运行 .class 文件的时候,就相当于启动了一个 JVM 进程,如何理解?

如何运行多进程Docker容器

如何使用 psexec 向远程计算机上启动的 cmd.exe 提供多个命令

Golang如何让子进程以另一个用户身份运行

如何使用多处理在Python中运行多个异步进程?