您的位置:首页 > 编程语言 > C#

C# 编写命令行交互工具——实时输出_获取执行结果

2016-05-26 00:00 621 查看
我们在写程序的时候通常会用到命令行工具。

如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);
}
}


那么最后的效果图为

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: