C# 在进程中等待进程
我正在尝试构建一个cmd.exe包装器,但我不知道如何等待cmd进程内的进程完成 当我在程序中运行ping.exe时,我的“inputline”(路径)将在ping命令完成之前输出到控制台 我无法使用:。WaitForInputIdle();因为我没有GUI。“这可能是因为该进程没有图形界面。” 甚至有可能解决这个问题吗?或者有更好的方法吗C# 在进程中等待进程,c#,process,C#,Process,我正在尝试构建一个cmd.exe包装器,但我不知道如何等待cmd进程内的进程完成 当我在程序中运行ping.exe时,我的“inputline”(路径)将在ping命令完成之前输出到控制台 我无法使用:。WaitForInputIdle();因为我没有GUI。“这可能是因为该进程没有图形界面。” 甚至有可能解决这个问题吗?或者有更好的方法吗 using System; using System.Collections.Generic; using System.Diagnostics; usin
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);
}
}
}
}
启动进程时,可以指定要等待:
var process = Process.Start(...);
process.WaitForExit();
以下是MSDN的链接,对此进行了解释:
我认为这是您需要的。如果您只想捕获实际进程,则可以使用如下轮询方法:
ping
(.exe)ping
进程,并等待以前不存在的所有进程ping
,则此操作将失败,或者至少不准确
您还应该记住,
CMD
不会等待所有类型的进程,只有那些被定义为控制台应用程序的进程(参见问题)。它不会工作。因为该程序正在等待cmd.exe完成,而不是ping.exe,并且您是否总是要执行ping.exe命令,否则您可以启动ping.exe而不是cmd.exe+1来尝试回答信息不足的问题。否,我希望能够将cmd.exe用作cmd,但要与另一个输入/输出一起使用,以便发送其他命令。您尝试使用PowerShell脚本执行的操作通常与通过包装命令外壳无法完成该操作的原因完全相同。重新思考您的策略以及您正试图实现的目标。您不能使用cmd
流程启动批处理文件吗?这将按顺序启动命令并等待响应。这对我没有帮助。Ping.exe只是一个例子。我可能想运行一个dir命令,然后在查看dir命令后,我想运行多个cd命令等等。您能清楚地告诉我们您想做什么吗?(-1)@richard问题的第一句话是:“我正在尝试构建一个cmd.exe包装器”。什么不清楚?@richard什么不清楚?阅读主题和问题。。。