如何使用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
实例上调用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 1和exit 2),您将得到类似于下面的输出:
Handle: 1308, PID: 9060, Exit code: 1
Handle: 1324, PID: 8428, Exit code: 2
进程属性如ExitCode
和Handle
正确返回最后终止进程的值。但是它们在之前运行的进程中丢失了,并且您也有资源泄漏,因为为前一个进程分配的系统资源尚未被处置(以下引用来自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);
}