咱們在寫程序的時候一般會用到命令行工具。前端
如Ping 某個網段,寫個註冊表,啓動項,或者感謝其餘壞事。shell
在網上查了一下,多數都說用C# 作命令行交互須要作不少不少的邏輯處理。那麼今天博主也來寫一個簡單一點的。c#
首先咱們建一個CmdUtils類,而後編寫咱們須要的方法工具
那麼在開始以前,咱們先看下網上提供的方法。this
那麼開始,咱們先新建一個類,而後編寫方法命令行
Process cmd = null; if (cmd == null) { cmd = new Process();//建立進程對象 ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = "cmd.exe";//設定須要執行的命令 startInfo.Arguments = "/C "+shell;//「/C」表示執行完命令後立刻退出 startInfo.UseShellExecute = false;//不使用系統外殼程序啓動 startInfo.RedirectStandardInput = true;//不重定向輸入 startInfo.RedirectStandardOutput = true; //重定向輸出 startInfo.CreateNoWindow = true;//不建立窗口 cmd.StartInfo = startInfo; // cmd.Start(); } if (cmd.Start())//開始進程 { string str = cmd.StandardOutput.ReadToEnd(); cmd.Close(); cmd = null; return str; } return null;
那麼很明顯,cmd 在執行完畢以後就被關閉了線程
Ok,修改一下,不加/c 也就是執行完畢以後不退出code
Process cmd = null; if (cmd == null) { cmd = new Process();//建立進程對象 ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = "cmd.exe";//設定須要執行的命令 startInfo.Arguments = "";//「/C」表示執行完命令後立刻退出 startInfo.UseShellExecute = false;//不使用系統外殼程序啓動 startInfo.RedirectStandardInput = true;//不重定向輸入 startInfo.RedirectStandardOutput = true; //重定向輸出 startInfo.CreateNoWindow = true;//不建立窗口 cmd.StartInfo = startInfo; // cmd.Start(); }
下面接着寫怎樣將前端顯示的搞到執行的來。咱們都知道string 屬於引用數據類型,那麼笨方法就從該變量下手。orm
咱們在CmdUtils中定義一個shell 的string 變量,並設置訪問權限爲public ,方便調用。對象
public String shell = "";
public partial class Cmd : Form { public String isRun ="start"; CmdUtils cmd = new CmdUtils(); public Cmd() { InitializeComponent(); new Thread(new ThreadStart(init)).Start(); } private void init() { cmd.sendCmd(this); } private void sendBtn_Click(object sender, EventArgs e) { cmd.shell = comEdit.Text; } private void exitBtn_Click(object sender, EventArgs e) { cmd.shell = "exit"; } }
下面上CmdUtils 代碼
public class CmdUtils { public String shell = ""; public void sendCmd(Cmd cmdoom) { Process cmd = null; if (cmd == null) { cmd = new Process();//建立進程對象 ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = "cmd.exe";//設定須要執行的命令 startInfo.Arguments = "";//「/C」表示執行完命令後立刻退出 startInfo.UseShellExecute = false;//不使用系統外殼程序啓動 startInfo.RedirectStandardInput = true;//不重定向輸入 startInfo.RedirectStandardOutput = true; //重定向輸出 startInfo.CreateNoWindow = true;//不建立窗口 cmd.StartInfo = startInfo; // cmd.Start(); } if (cmd.Start())//開始進程 { cmd.StandardOutput.ReadLine().Trim(); cmd.StandardOutput.ReadLine().Trim(); while (cmdoom.isRun.IndexOf("start") != -1) { if (shell.Length > 0) { cmd.StandardInput.WriteLine(shell); cmd.StandardOutput.ReadLine().Trim(); cmd.StandardInput.WriteLine("\n"); String log = cmd.StandardOutput.ReadLine().Trim(); String path = log.Substring(0, 2).ToUpper(); updateLog(cmdoom, log); log = ""; do { String logm = cmd.StandardOutput.ReadLine().Trim(); if (logm.IndexOf(path) != -1){ break; } updateLog(cmdoom, logm+"\n"); log+=logm; } while (true); shell = ""; } } cmd.Close(); cmd = null; return ; } return ; } private delegate void UpdateLog(); private void updateLog(Cmd cmd, String log) { UpdateLog set = delegate() { cmd.cmdLogTextArea.AppendText("\n" + log); }; cmd.Invoke(set); } }