1. 程式人生 > >C#程式呼叫cmd執行命令

C#程式呼叫cmd執行命令

string str = Console.ReadLine();

            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.FileName = "cmd.exe";
            p.StartInfo.UseShellExecute = false;    //是否使用作業系統shell啟動
            p.StartInfo.RedirectStandardInput = true;//接受來自呼叫程式的輸入資訊
            p.StartInfo.RedirectStandardOutput = true;//由呼叫程式獲取輸出資訊
            p.StartInfo.RedirectStandardError = true;//重定向標準錯誤輸出
            p.StartInfo.CreateNoWindow = true;//不顯示程式視窗
            p.Start();//啟動程式

            //向cmd視窗傳送輸入資訊
            p.StandardInput.WriteLine(str + "&exit");

            p.StandardInput.AutoFlush = true;
            //p.StandardInput.WriteLine("exit");
            //向標準輸入寫入要執行的命令。這裡使用&是批處理命令的符號,表示前面一個命令不管是否執行成功都執行後面(exit)命令,如果不執行exit命令,後面呼叫ReadToEnd()方法會假死
            //同類的符號還有&&和||前者表示必須前一個命令執行成功才會執行後面的命令,後者表示必須前一個命令執行失敗才會執行後面的命令



            //獲取cmd視窗的輸出資訊
            string output = p.StandardOutput.ReadToEnd();

            //StreamReader reader = p.StandardOutput;
            //string line=reader.ReadLine();
            //while (!reader.EndOfStream)
            //{
            //    str += line + "  ";
            //    line = reader.ReadLine();
            //}

            p.WaitForExit();//等待程式執行完退出程序
            p.Close();


            Console.WriteLine(output);

程式執行結果:

 

需要提醒注意的一個地方就是:在前面的命令執行完成後,要加exit命令,否則後面呼叫ReadtoEnd()命令會假死。

另一種C#呼叫cmd命令的方法:

/// <summary>
        /// 執行cmd命令
        /// 會顯示命令視窗
        /// </summary>
        /// <param name="cmdExe">指定應用程式的完整路徑</param>
        /// <param name="cmdStr">執行命令列引數</param>
        static bool RunCmd(string cmdExe, string cmdStr)
        {
            bool result = false;
            try
            {
                using (Process myPro = new Process())
                {
                    //指定啟動程序是呼叫的應用程式和命令列引數
                    ProcessStartInfo psi = new ProcessStartInfo(cmdExe, cmdStr);
                    myPro.StartInfo = psi;
                    myPro.Start();
                    myPro.WaitForExit();
                    result = true;
                }
            }
            catch
            {

            }
            return result;
        }

        /// <summary>
        /// 執行cmd命令
        /// 不顯示命令視窗
        /// </summary>
        /// <param name="cmdExe">指定應用程式的完整路徑</param>
        /// <param name="cmdStr">執行命令列引數</param>
        static bool RunCmd2(string cmdExe, string cmdStr)
        {
            bool result = false;
            try
            {
                using (Process myPro = new Process())
                {
                    myPro.StartInfo.FileName = "cmd.exe";
                    myPro.StartInfo.UseShellExecute = false;
                    myPro.StartInfo.RedirectStandardInput = true;
                    myPro.StartInfo.RedirectStandardOutput = true;
                    myPro.StartInfo.RedirectStandardError = true;
                    myPro.StartInfo.CreateNoWindow = true;
                    myPro.Start();
                    //如果呼叫程式路徑中有空格時,cmd命令執行失敗,可以用雙引號括起來 ,在這裡兩個引號表示一個引號(轉義)
                    string str = string.Format(@"""{0}"" {1} {2}", cmdExe, cmdStr, "&exit");
                  
                    myPro.StandardInput.WriteLine(str);
                    myPro.StandardInput.AutoFlush = true;
                    myPro.WaitForExit();

                    result = true;
                }
            }
            catch
            {

            }
            return result;
        }

原文章:點選開啟連結

using System.Diagnostics;
public class CmdHelper
    {
        private static string CmdPath = @"C:\Windows\System32\cmd.exe";

        /// <summary>
        /// 執行cmd命令
        /// 多命令請使用批處理命令連線符:
        /// <![CDATA[
        /// &:同時執行兩個命令
        /// |:將上一個命令的輸出,作為下一個命令的輸入
        /// &&:當&&前的命令成功時,才執行&&後的命令
        /// ||:當||前的命令失敗時,才執行||後的命令]]>
        /// 其他請百度
        /// </summary>
        /// <param name="cmd"></param>
        /// <param name="output"></param>
        public static void RunCmd(string cmd, out string output)
        {
            cmd = cmd.Trim().TrimEnd('&') + "&exit";//說明:不管命令是否成功均執行exit命令,否則當呼叫ReadToEnd()方法時,會處於假死狀態
            using (Process p = new Process())
            {
                p.StartInfo.FileName = CmdPath;
                p.StartInfo.UseShellExecute = false;        //是否使用作業系統shell啟動
                p.StartInfo.RedirectStandardInput = true;   //接受來自呼叫程式的輸入資訊
                p.StartInfo.RedirectStandardOutput = true;  //由呼叫程式獲取輸出資訊
                p.StartInfo.RedirectStandardError = true;   //重定向標準錯誤輸出
                p.StartInfo.CreateNoWindow = true;          //不顯示程式視窗
                p.Start();//啟動程式

                //向cmd視窗寫入命令
                p.StandardInput.WriteLine(cmd);
                p.StandardInput.AutoFlush = true;

                //獲取cmd視窗的輸出資訊
                output = p.StandardOutput.ReadToEnd();
                p.WaitForExit();//等待程式執行完退出程序
                p.Close();
            }
        }
    }
使用示例

示例1:顯示ipconfig資訊

string cmd 
[email protected]
"ipconfig/all"; 示例2:開啟VS2010命令提示 string cmd [email protected]"C:&cd C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC&vcvarsall.bat"; 示例3:使用sn.exe工具產生金鑰對並顯示 string cmd [email protected]"C:&cd C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC&vcvarsall.bat&sn -k d:\LicBase.snk&sn -p d:\LicBase.snk d:\LicBasePubKey.snk&sn -tp d:\LicBasePubKey.snk"; 呼叫 string output = ""; CmdHelper.RunCmd(cmd, out output); MessageBox.Show(output);
文章連結: 點選開啟連結