C# 編寫命令列互動工具——實時輸出_獲取執行結果
阿新 • • 發佈:2019-02-16
我們在寫程式的時候通常會用到命令列工具。
如Ping 某個網段,寫個登錄檔,啟動項,或者感謝其他壞事。
在網上查了一下,多數都說用C# 做命令列互動需要做很多很多的邏輯處理。那麼今天博主也來寫一個簡單一點的。
首先我們建一個CmdUtils類,然後編寫我們需要的方法
那麼在開始之前,我們先看下網上提供的方法。
那麼開始,我們先新建一個類,然後編寫方法
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 也就是執行完畢之後不退出
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 屬於引用資料型別,那麼笨方法就從該變數下手。
我們在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"; } }
我們首先啟動一個執行緒,然後通過改變shell 變數達到互動效果。
下面上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);
}
}
那麼最後的效果圖為