在C#窗口中运行系统命令

有些时候运行系统命令可以很方便的达到一些特定目的。比如说,可以用c:/>powercfg /H on来启用系统休眠。c:/>netsh firewall set opmode DISABLE可以用来禁用系统防火墙。

首先,在C#中运行一个外部程序是非常简单的: System.Diagnostics.Process.Start("cmd.exe", "/K dir");

该命令会弹出一个命令行窗口并 列出当前目录中的文件。把/K改成/C可以自动关闭弹出的命令行窗口,不过黑窗口还是一闪而过,而且我们看不到运行结果。

对于我们漂亮的WinForm窗口,跳出黑黑的DOS窗口总是非常丑陋和让人不爽的。如何既能运行系统命令,又能拿到结果,而且还不显示丑陋的命令行窗口呢?解决方法就是Process类中StartInfo成员。StartInfo成员可以指定弹出窗口是最小化,最大化,或是隐藏窗口。更妙的是,我们可以通过设定StartInfo.CreateNoWindow=false,让该进程没有任何关联窗口!同时,我们接管该进程的标准输入和输出。设定StartInfo.RedirectStandardOutput为真,然后从Process.StandartOutput读取运行结果。  

以下是一个逐步的示范,可以显示你机器当前的IP配置:

一、用VS2005或者C# Express建立一个Winform程序。

二、添加一个按钮和一个RichTextBox。

三、在设计界面双击添加的按钮,自动生成button1_Click事件响应代码。

四、把button1_Click代码换成以下所附代码。

五、编译并运行,大致运行结果可见所附的图片。

private   void  button1_Click( object  sender, EventArgs e) 
{
  System.Diagnostics.Process proc 
= new Process();
  proc.StartInfo.FileName 
= "netsh.exe"
  proc.StartInfo.Arguments 
= "interface ipv4 show config";

  proc.StartInfo.CreateNoWindow 
= true;
  proc.StartInfo.UseShellExecute 
= false
  proc.StartInfo.RedirectStandardOutput 
= true

  
this.Cursor = System.Windows.Forms.Cursors.WaitCursor;
  proc.Start(); 
  
using (StreamReader reader = proc.StandardOutput)
  

    
string line = reader.ReadLine(); 
    
while (line != null)
    

      richTextBox1.AppendText(line 
+ " "); 
      Application.DoEvents(); 
      line 
= reader.ReadLine(); 
    }
 
  }
 
  proc.WaitForExit(); 
  
this.Cursor = Cursors.Default; 
}
 

 demo result

讨论
在C#中重定向标准输入输出是很容易的。Process.StandartInput和Process.StandartOutput支持StreamWriter和StreamReader,读输出跟读文件一样方便。用C++来做其实还麻烦一些。同样的道理,我们需要准备一个STARTUPINFO结构并设置它的hStdOutput成员。该句柄可以是一个文件句柄或者是命名管道的句柄,分别用来重定向输出到文件,或者到命名管道另一端的程序。论坛里问过如何做Telnet,其实在服务端运行类似程序并把结果传给远程终端,就是Telnet的初步实现。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值