我正在尝试构建cmd.exe包装器,但我无法弄清楚如何等待cmd进程内的进程完成。
当我在我的程序中运行ping.exe时,我的“输入线”(路径)将在ping命令完成之前输出到控制台。
我无法使用:.WaitForInputIdle();因为我没有GUI。 “这可能是因为该过程没有图形界面。”
甚至可以解决还是有更好的方法来做到这一点?
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ObjectTest
{
class cmd
{
Process cmdProcess;
StreamWriter cmdStreamWriter;
public cmd()
{
//WinAPI.ShowConsoleWindow();
Process();
//WinAPI.HideConsoleWindow();
}
private void Process()
{
StartCmd();
string command = "";
while (command != "exit")
{
Thread.Sleep(100);
cmdProcess.WaitForInputIdle();
Console.Write(Environment.NewLine + Directory.GetCurrentDirectory() + "> ");
command = Console.ReadLine();
SendCommand(command);
}
}
private void StartCmd()
{
cmdProcess = new Process();
cmdProcess.StartInfo.FileName = "cmd.exe";
cmdProcess.StartInfo.UseShellExecute = false;
cmdProcess.StartInfo.CreateNoWindow = true;
cmdProcess.StartInfo.RedirectStandardOutput = true;
cmdProcess.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler);
cmdProcess.ErrorDataReceived += new DataReceivedEventHandler(SortOutputHandler);
cmdProcess.StartInfo.RedirectStandardInput = true;
cmdProcess.Start();
cmdStreamWriter = cmdProcess.StandardInput;
cmdProcess.BeginOutputReadLine();
}
private void SendCommand(string command)
{
cmdStreamWriter.WriteLine(command);
}
private void btnQuit_Click(object sender, EventArgs e)
{
cmdStreamWriter.Close();
cmdProcess.WaitForExit();
cmdProcess.Close();
}
private static void SortOutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
{
if (!string.IsNullOrEmpty(outLine.Data))
{
Console.WriteLine(outLine.Data);
}
}
}
}
答案 0 :(得分:0)
如果它只是你想要捕获的实际进程,你可以使用这样的轮询方法:
在运行命令之前,使用Process.GetProcessesByName
收集所有现有进程,例如ping
(。exe),并存储它们的PID。
运行命令
为了等待退出,再次扫描所有ping
进程,并等待以前不存在的所有进程。
请注意,如果其他流程在步骤1和3之间启动另一个ping
,则会失败,或者至少不准确。
您还应该记住CMD
不等待所有类型的进程,只有那些被定义为控制台应用程序的进程(请参阅this问题)。
答案 1 :(得分:-1)
启动流程时,您可以指定要等待:
var process = Process.Start(...);
process.WaitForExit();
这是MSDN解释它的链接:http://msdn.microsoft.com/en-us/library/fb4aw7b8(v=vs.110).aspx
我认为这是你需要的。