The best VPN 2024

The Best VPS 2024

The Best C# Book

C# runs cmd to output messages in real time

How to let C# runs cmd to output messages in real time? Today, I use WinForm to write an automated tool software. I need to call cmd to run some batch scripts, and I need to output response messages in real time in another WinForm form. How to achieve it? This post answers that question with sample code.

C# runs cmd to output messages

When writing C# projects, I sometimes use the cmd command to perform some operations. Here is an example I wrote to illustrate how to use the cmd command line in C#, In the sample code below, you can execute multiple commands.

C# runs cmd to output messages in real time
C# runs cmd to output messages in real time

Code Sample

    /// <summary>
    /// CMD Executor
    /// </summary>
    public static class CmdExecutor
    {
        /// <summary>
        /// Execute CMD command and get console output
        /// </summary>
        /// <param name="command">cmmand</param>
        /// <param name="workingDir">Working directory, default is "."</param>
        /// <param name="callBack">Callback</param>
        public static void ExecuteCmd(string[] command, string workingDir, DataReceivedEventHandler callBack = null)
        {
            using (Process pc = new Process())
            {
                pc.StartInfo.FileName = "cmd.exe";
                pc.StartInfo.CreateNoWindow = true;
                pc.StartInfo.RedirectStandardError = true;
                pc.StartInfo.RedirectStandardInput = true;
                pc.StartInfo.RedirectStandardOutput = true;
                pc.StartInfo.UseShellExecute = false;
                pc.StartInfo.WorkingDirectory = workingDir;
                //pc.StartInfo.StandardOutputEncoding = Encoding.Default;
                pc.OutputDataReceived += callBack;
                pc.Start();
                pc.BeginOutputReadLine();

                int lenght = command.Length;
                foreach (string com in command)
                {
                    pc.StandardInput.WriteLine(com);
                }
                pc.StandardInput.WriteLine("exit");
                pc.Close();
            }
        }

        /// <summary>
        /// Execute the CMD command file and get the console output
        /// </summary>
        public static string ExecuteCmdFile(string fileName)
        {
            Check.FileExists(fileName, nameof(fileName));
            string ext = Path.GetExtension(fileName);
            if (!new[] { ".bat", ".cmd" }.Any(m => m.Equals(ext, StringComparison.OrdinalIgnoreCase)))
            {
                throw new ArgumentException("The filename must end with ".bat, .cmd");
            }

            Process process = new Process();
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.FileName = fileName;
            process.Start();
            string output = process.StandardOutput.ReadToEnd();
            process.WaitForExit();
            return output;
        }
    }

Example Program Running Video

C# runs cmd to output messages in real time

How to call?

You just need to add a button on the form, add an event, and call it like the following in the event code.

        private void button1_Click(object sender, EventArgs e)
        {
            CmdExecutor.ExecuteCmd(textBox1.Text.Split('|'), ".", (s, dre) =>
            {
                richTextBox1.SetText(dre.Data);
            });
        }
C# runs cmd to output messages in real time

Because it is running in multiple threads, SetText in the above code is an extension method, as follows:

        /// <summary>
        ///Safely set control Text value in multi-threaded environment
        /// </summary>
        /// <param name="control">any control object</param>
        /// <param name="text">text value</param>
        public static void SetText(this Control control, string text)
        {
            if (control is RichTextBox)
            {
                var richTextBox = control as RichTextBox;
                richTextBox.Invoke(new MethodInvoker(delegate ()
                {
                    if (richTextBox.Text.Length > 90000) richTextBox.Text = string.Empty;
                    richTextBox.Text += text + "\r\n";
                    richTextBox.SelectionStart = richTextBox.TextLength;
                    richTextBox.ScrollToCaret();
                }));
            }
            else
            {
                control?.Invoke(new Action(() =>
                {
                    control.Text = text;
                }));
            }
        }
C# runs cmd to output messages in real time
C# runs cmd to output messages in real time

Leave a Comment