Redirect console output to textbox in separate program

前端 未结 5 1994
误落风尘
误落风尘 2020-11-22 16:16

I\'m developing an Windows Forms application that requires me to call a separate program to perform a task. The program is a console application and I need to redirect stan

相关标签:
5条回答
  • 2020-11-22 16:39

    This works for me:

    void RunWithRedirect(string cmdPath)
    {
        var proc = new Process();
        proc.StartInfo.FileName = cmdPath;
    
        // set up output redirection
        proc.StartInfo.RedirectStandardOutput = true;
        proc.StartInfo.RedirectStandardError = true;    
        proc.EnableRaisingEvents = true;
        proc.StartInfo.CreateNoWindow = true;
        // see below for output handler
        proc.ErrorDataReceived += proc_DataReceived;
        proc.OutputDataReceived += proc_DataReceived;
    
        proc.Start();
    
        proc.BeginErrorReadLine();
        proc.BeginOutputReadLine();
    
        proc.WaitForExit();
    }
    
    void proc_DataReceived(object sender, DataReceivedEventArgs e)
    {
        // output will be in string e.Data
    }
    
    0 讨论(0)
  • 2020-11-22 16:44

    Thanks to Marc Maxham for his answer that save me time !

    As Jon of All Trades notice it, UseShellExecute must be set to false in order to redirect IO streams, otherwise the Start() call throws an InvalidOperationException.

    Here is my modification of the code where txtOut is a WPF readonly Textbox

    void RunWithRedirect(string cmdargs)
    {
        var proc = new Process()
        {
            StartInfo = new ProcessStartInfo("cmd.exe", "/k " + cmdargs)
            {
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                CreateNoWindow = true
            },
            EnableRaisingEvents = true
        };
    
        // see below for output handler
        proc.ErrorDataReceived += proc_DataReceived;
        proc.OutputDataReceived += proc_DataReceived;
        proc.Start();
    
        proc.BeginErrorReadLine();
        proc.BeginOutputReadLine();
    
        proc.WaitForExit();
    }
    
    void proc_DataReceived(object sender, DataReceivedEventArgs e)
    {
        if (e.Data != null)
            Dispatcher.BeginInvoke(new Action( () => txtOut.Text += (Environment.NewLine + e.Data) ));
    }
    
    0 讨论(0)
  • 2020-11-22 16:53

    You can use the following code

            MemoryStream mem = new MemoryStream(1000);
            StreamWriter writer = new StreamWriter(mem);
            Console.SetOut(writer);
    
            Assembly assembly = Assembly.LoadFrom(@"C:\ConsoleApp.exe");
            assembly.EntryPoint.Invoke(null, null);
            writer.Close();
    
            string s = Encoding.Default.GetString(mem.ToArray());
            mem.Close();
    
    0 讨论(0)
  • 2020-11-22 16:57

    I've added a number of helper methods to the O2 Platform (Open Source project) which allow you easily script an interaction with another process via the console output and input (see http://code.google.com/p/o2platform/source/browse/trunk/O2_Scripts/APIs/Windows/CmdExe/CmdExeAPI.cs)

    Also useful for you might be the API that allows the viewing of the console output of the current process (in an existing control or popup window). See this blog post for more details: http://o2platform.wordpress.com/2011/11/26/api_consoleout-cs-inprocess-capture-of-the-console-output/ (this blog also contains details of how to consume the console output of new processes)

    0 讨论(0)
  • 2020-11-22 16:58

    See How to run a .EXE file from C# and obtain(pipe) the results from DOS windows back into the C#

    0 讨论(0)
提交回复
热议问题