很多專業的配置工具都不提供UI工具,只提供命令行操作,如很多網絡設施的配置等。命令行工具具有輸入效率高、批量運行等優點,但是對於使用者的專業要求較高,而且,大量的指令輸入,對記憶力也是一個考驗。
事實上,我們可以借助.net,將某些常用的命令圖形化,這樣既方便了使用,也減少了輸入大量命令的負擔。
我們主要使用System.Diagnostics.Process和System.Diagnostics.ProcessStartInfo兩個類。
我們新建一個WPF的簡單窗體,包含兩個文本框,分別用於顯示Input和Output信息,然后添加幾個命令按鈕,注冊按鈕事件響應:
var runProcess = new Process();
string cmd = "ping 10.10.10.2";
var config = new ProcessStartInfo("cmd.exe"); //執行的程序,這里是cmd.exe命令行工具
config.RedirectStandardInput = true; //重定向命令行的輸入流,以便我們可以通過程序輸入命令以模仿手工輸入
config.RedirectStandardOutput = true; //輸出流重定向,保證可以獲取命令行執行命令后的輸出結果
config.UseShellExecute = false; //不顯示命令行運行窗口?
config.CreateNoWindow = true; //不顯示命令行運行窗口
runProcess.StartInfo = config;
runProcess.OutputDataReceived += runProcess_OutputDataReceived; //注冊輸出流事件,一旦命令行輸出信息,可以從中取出信息
runProcess.Start();
runProcess.StandardInput.WriteLine(cmd); //輸入各種控制命令
runProcess.BeginOutputReadLine(); //開始讀取輸出信息。這是個關鍵的步驟,否則不觸發任何輸出事件
接下來,就是簡單的輸出事件訂閱:
void runProcess_OutputDataReceived(object sender, DataReceivedEventArgs e) { Dispatcher.BeginInvoke(new Action(() => output.Text += e.Data)); }
可以看到,僅僅是從DataREceivedEventArgs中的Data獲取輸出字符串。注意,事件執行程序是在其他線程中運行的,在諸如WINFORM和WPF等STA程序中,必須封送消息到UI線程上,WPF中就是使用Dispatcher.Invoke(Action)方法。
如圖所示,運行效果。這樣,我們可以封裝很多常用的命令到圖形界面,便於非專業人員的使用。
