如何使用进程运行多个命令
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 1 和 exit 2),您将获得类似于此的输出:
Handle: 1308, PID: 9060, Exit code: 1
Handle: 1324, PID: 8428, Exit code: 2
像ExitCode
和Handle
这样的进程属性会正确返回最后一个终止进程的值。但是它们在之前运行的进程中丢失了,并且您还有一个资源泄漏,因为为之前的进程分配的系统资源尚未被释放(以下引用来自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);
【讨论】:
以上是关于如何使用进程运行多个命令的主要内容,如果未能解决你的问题,请参考以下文章
当使用 Java 命令运行 .class 文件的时候,就相当于启动了一个 JVM 进程,如何理解?