很多专业的配置工具都不提供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)方法。
如图所示,运行效果。这样,我们可以封装很多常用的命令到图形界面,便于非专业人员的使用。
时间: 2024-11-23 23:15:55