views:

57

answers:

4

This one should be an easy one.

An example would be the following:

The user clicks a button titled "Ping" and it uses the command prompt "ping" to ping the server. The output is captured in a string and displayed in the windows forms app to the user.

+2  A: 
Process p = System.Diagnostics.Process.Start("ping ...."); 
System.IO.StreamReader reader = p.StandardOutput; 
string sRes = reader.ReadToEnd(); 
reader.Close(); 

The string variable sRes should contain the results of the ping command.

Otávio Décio
+3  A: 

Use the Process class to start a new process. You can redirect standard error and output - in this case you probably want to do so in an event-driven manner, to write text to the app when it comes out of ping.

Assuming you want the user to see output as it comes, you don't want to use ReadToEnd on the output - that will block until it's finished.

Here's a complete example which writes to the console - but it shows how to do it as the process writes output, rather than waiting for the process to finish:

using System;
using System.Diagnostics;

class Test
{
    static void Main(string[] args)
    {
        ProcessStartInfo psi = new ProcessStartInfo("ping")
        {
            UseShellExecute = false,
            RedirectStandardError = true,
            RedirectStandardOutput = true,
            Arguments = "google.com"
        };
        Process proc = Process.Start(psi);
        proc.EnableRaisingEvents = true;
        proc.OutputDataReceived += (s, e) => Console.WriteLine(e.Data);
        proc.BeginOutputReadLine();
        proc.ErrorDataReceived += (s, e) => Console.WriteLine(e.Data);
        proc.BeginErrorReadLine();
        proc.WaitForExit();
        Console.WriteLine("Done");
    }
}

Just for good measure, here's a complete WinForms app:

using System;
using System.Drawing;
using System.Diagnostics;
using System.Windows.Forms;

class Test
{
    [STAThread]
    static void Main(string[] args)
    {
        Button button = new Button {
            Text = "Click me",
            Dock = DockStyle.Top
        };        
        TextBox textBox = new TextBox {
            Multiline = true,
            ReadOnly = true,
            Location = new Point(5, 50),
            Dock = DockStyle.Fill
        };
        Form form = new Form {
            Text = "Pinger",
            Size = new Size(500, 300),
            Controls = { textBox, button }
        };

        Action<string> appendLine = line => {
            MethodInvoker invoker = () => textBox.AppendText(line + "\r\n");
            textBox.BeginInvoke(invoker);
        };

        button.Click += delegate
        {        
            ProcessStartInfo psi = new ProcessStartInfo("ping")
            {
                UseShellExecute = false,
                RedirectStandardError = true,
                RedirectStandardOutput = true,
                Arguments = "google.com"
            };
            Process proc = Process.Start(psi);
            proc.EnableRaisingEvents = true;
            proc.OutputDataReceived += (s, e) => appendLine(e.Data);
            proc.BeginOutputReadLine();
            proc.ErrorDataReceived += (s, e) => appendLine(e.Data);
            proc.BeginErrorReadLine();
            proc.Exited += delegate { appendLine("Done"); };
        };

        Application.Run(form);
    }
}
Jon Skeet
I just can't get ahead today...haha.
Justin Niessner
A: 

I covered this pretty extensively on my blog. You can copy paste the fully compileable example. With only a very basic understanding of Winforms you can fill in the blanks yourself.

P.Brian.Mackey
+1  A: 
public static string Ping(string url)
{
    Process p = System.Diagnostics.Process.Start("ping.exe", url);
    StreamReader reader = p.StandardOutput;

    String output = reader.ReadToEnd();
    reader.Close();

    return output;
}
Justin Niessner