繁体   English   中英

在C#中,如果程序不断输出,您如何从DOS程序中读取?

[英]In C# How do you read from DOS program you executed if the program is constantly outputting?

我发现了许多关于如何执行cmd.exe并执行命令的编码示例,甚至执行nslookup和交互,但我遇到的问题是使用特定的dos程序,当它启动时,它不会停止“输出” 。 这里是一些代码,我将发表评论和我从C#得到的错误

这是我如何以更高级的方式设置它,以便我可以从事件的程序接收输出

public void StartApplication(string appNameAndPath)
{
        StreamReader outputStream;
        Process p = new Process();
        p.StartInfo.FileName = appNameAndPath;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.CreateNoWindow = false;//for now just so I can see it
        p.Start();
//here is my advanced example
if(advanced == true)
{
        outputStream = p.StandardOutput;
        DoReadOutPut();
}
else
{//here is a simple example 
    while (p.StandardOutput.ReadLine() != null)  //this hangs here until the application exists
    {
        txt += (p.StandardOutput.ReadLine());
    }
}
}

 void DoReadOutput()
 {
        outputStream.BaseStream.BeginRead( readOutputBuffer, 0, readOutputBuffer.Length, new AsyncCallback( OnReadOutputCompleted ), null );  
       //this does sometimes fire but only with 0 bytes, on other dos programs it would say Memory read not allowed
 }

 void OnReadOutputCompleted( IAsyncResult result )
 {
        int cbRead = outputStream.BaseStream.EndRead( result );
        ProcessOutput( readOutputBuffer, cbRead );
        DoReadOutput();
 }

 private void ProcessOutput(byte[] buffer, int cbRead)
 {
        string text = p.StartInfo.StandardOutputEncoding.GetString(buffer, 0, 10000); //this is where it hangs until the program exits or is not writing anymore
        this.Invoke((Action)delegate
        {

            SetTextBoxValue(text);//im doing this because im on another thread otherwise textBox1.Text - text"

        });
  }

我不想使用API​​和GetText并为ReadLastLine创建引擎,任何人都可以帮助我吗? 我想你会想要一个示例exe,创建一个C#应用程序, while(true){Console.WriteLine("bla");}就足够作为示例exe而不是我遇到麻烦的exe。 exe接管dos窗口并具有“旧学校界面”

async / await可以帮助....

await Exec(yourExe,parameters);

Task Exec(string exe,string args)
{
    var tcs = new TaskCompletionSource<object>();

    ProcessStartInfo psi = new ProcessStartInfo();
    psi.FileName = exe;
    psi.UseShellExecute = false;
    psi.RedirectStandardOutput = true;
    psi.Arguments = args;

    var proc = Process.Start(psi);

    proc.OutputDataReceived += (s, e) =>
    {
        this.Invoke((Action) (()=>richTextBox1.AppendText(e.Data + Environment.NewLine)));
    };

    proc.Exited += (s, e) => tcs.SetResult(null);

    proc.EnableRaisingEvents = true;
    proc.BeginOutputReadLine();

    return tcs.Task;
}

您需要处理回调事件以读取流:

  startInfo.UseShellExecute        = false;
  startInfo.CreateNoWindow         = true;
  startInfo.RedirectStandardOutput = true;
  startInfo.RedirectStandardError  = true;

  Process proc = new Process();
  proc.StartInfo           = startInfo;
  proc.ErrorDataReceived  += new DataReceivedEventHandler(DataReceiveHandler);
  proc.OutputDataReceived += new DataReceivedEventHandler(DataReceiveHandler);
  proc.Start();
  proc.BeginErrorReadLine();
  proc.BeginOutputReadLine();
  proc.WaitForExit();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM