网上有很多用C#调用cmd的方法,大致如下:

[c-sharp] view plaincopy

  1. private void ExecuteCmd(string command)  
  2. {  
  3. Process p = new Process();  
  4. p.StartInfo.FileName = "cmd.exe";  
  5. p.StartInfo.UseShellExecute = false;  
  6. p.StartInfo.RedirectStandardInput = true;  
  7. p.StartInfo.RedirectStandardOutput = true;  
  8. p.StartInfo.CreateNoWindow = true;  
  9. p.Start();  
  10. p.StandardInput.WriteLine(command);  
  11. p.StandardInput.WriteLine("exit");  
  12. p.WaitForExit();  
  13. this.textBox1.Text=textBox1.Text+ p.StandardOutput.ReadToEnd();  
  14. p.Close();  
  15. }
上面代码有几个不足,一是必须要exit那一句,否则就会死循环。

再就是每次执行Execute执行cmd后,都必须等到cmd执行完且cmd.exe进程退出,才能读到结果。有时候这样会让

我们的应用程序失去操作的连续性。

事实上,通过两个线程,一个访问输入管道,一个访问输出管道,可以很容易实现持续性的效果,

下面是一个Console程序:




[c-sharp] view plaincopy
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5. using System.Threading; 
  6. using System.Diagnostics; 
  7. namespace cmdtest 
  8. class Program 
  9. public static string cmd_str; 
  10. public static string cmd_outstr; 
  11. public static Process p = new Process(); 
  12. static void Main(string[] args) 
  13. p.StartInfo.FileName = "cmd.exe"; 
  14. p.StartInfo.UseShellExecute = false; 
  15. p.StartInfo.RedirectStandardInput = true; 
  16. p.StartInfo.RedirectStandardOutput = true; 
  17. p.StartInfo.RedirectStandardError = true; 
  18. p.StartInfo.CreateNoWindow = true; 
  19. p.Start(); 
  20. cmd_str = ""; 
  21. cmd_outstr = ""; 
  22. Thread t1 = new Thread(new ThreadStart(DoCmdThread)); 
  23. t1.Start(); 
  24. Thread t2 = new Thread(new ThreadStart(OutCmdThread)); 
  25. t2.Start(); 
  26. while(true) 
  27. cmd_str = Console.ReadLine(); 
  28. Thread.Sleep(10); 
  29. if (cmd_str == "exit") 
  30. break; 
  31. public static void DoCmdThread() 
  32. while (true) 
  33. if (cmd_str == "exit") 
  34. break; 
  35. if (cmd_str != "") 
  36. p.StandardInput.WriteLine(cmd_str); 
  37. //p.StandardInput.WriteLine("cd"); 
  38. cmd_str = ""; 
  39. Thread.Sleep(1); 
  40. public static void OutCmdThread() 
  41. while (true) 
  42. if (cmd_str == "exit") 
  43. p.StandardInput.WriteLine("exit"); 
  44. p.WaitForExit(); 
  45. p.Close(); 
  46. break; 
  47. cmd_outstr = p.StandardOutput.ReadLine(); 
  48. while(cmd_outstr != "") 
  49. Console.WriteLine(cmd_outstr); 
  50. cmd_outstr = p.StandardOutput.ReadLine(); 
  51. char[] ch = new char[256]; 
  52. int c = p.StandardOutput.Read(ch, 0, 256); 
  53. if (c > 0) 
  54. Console.Write(ch,0,c); 
  55. Thread.Sleep(1); 
  56. }

C# 调用cmd.exe的方法的更多相关文章

  1. C#程序调用cmd.exe执行命令

    代码部分 using System.Diagnostics; public class CmdHelper { private static string CmdPath = @"C:\Wi ...

  2. Java 调用cmd.exe命令

    原理:java的Runtime.getRuntime().exec(commandText)可以调用执行cmd指令. cmd /c dir 是执行完dir命令后关闭命令窗口. cmd /k dir 是 ...

  3. 调用cmd.exe执行pdf的合并(pdftk.exe)

    今天调查一个pdf文件的抽取,合并功能,用到下面这个工具(pdftk): https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/ 在cmd.exe里执 ...

  4. C++程序中调用其他exe可执行文件方法

    在编程过程中有个需求,点击某个按钮需要弹出系统的声音控制面板.在网上查了下代码中调用其他exe程序或者打开其他文件的方法. 自己借鉴网上的文章稍微总结下,加深下印象,也给方便自己用. 在代码中调用其他 ...

  5. Qt之启动外部程序(调用cmd.exe ping putty winscp 管道等等,比较牛叉)

    http://blog.csdn.net/u011012932/article/details/50478833

  6. 在IIS7.5中ASP.NET调用cmd程序拒绝访问决绝方法小记

    前言 昨天利用Github的Webhook实现自动部署站点,其中要调用命令行(cmd.exe)程序执行shell脚本. 在本地测试没有任何问题,部署到服务器之后,发现错误信息:访问拒绝. 问题 没有权 ...

  7. C# 调用cmd命令行路径中带空格问题

    今天打包winform程序,程序中本身有一处需要调用cmd.exe,打包安装在C:\Program Files目录下,然后调用cmd的地方,就弹出了C:\Program不是内部或外部命令,也不是可运行 ...

  8. C#程序调用cmd执行命令

    对于C#通过程序来调用cmd命令的操作,网上有很多类似的文章,但很多都不行,竟是漫天的拷贝.我自己测试整理了一下. 代码: string str = Console.ReadLine(); Syste ...

  9. C#程序调用cmd执行命令(转)

    C#通过程序来调用cmd命令的操作 string str = Console.ReadLine(); System.Diagnostics.Process p = new System.Diagnos ...

随机推荐

  1. 【2017-05-05】timer控件、三级联动、帐号激活权限设置

    一.Timer控件 Timer实际就是一个线程控件. 属性:Enabled    是否被启用 Interval     多长时间执行一次控件中的代码 事件: Tick     事件中放要执行的代码. ...

  2. Python安装mysqldb

    1.根据Python版本和自己的系统下载mysqldb http://www.codegood.com/downloads

  3. C#集合之并发集合

    .NET 4 开始,在System.Collection.Concurrent中提供了几个线程安全的集合类.线程安全的集合可防止多个线程以相互冲突的方式访问集合. 为了对集合进行线程安全的访问,定义了 ...

  4. 《快学Scala》——基础

    声明值和变量 用val定义的值实际上是常量.用var定义的值是变量.在scala中鼓励使用val.不需要给出值或变量的类型,这个信息可以通过初始化的表达式推断出来.(声明值和变量但不做初始化会报错) ...

  5. 如何通过 WebP 自适应方案减少图片资源大小

    前言 我们知道,理想的网页应该在 1 秒内打开,而在页面的整体大小中,图片往往是所占比例最大的一部分(大约占到 60% 以上,更多了解请点击),也可以参照如下图所示.优化图片不仅可以加快页面显示,还能 ...

  6. 如何用jQuery实现div随鼠标移动而移动(详解)?----2017-05-12

    重点是弄清楚如何获取鼠标现位置与移动后位置,div现在位置与移动后位置: 用jQuery实现div随鼠标移动而移动,不是鼠标自身的位置!!而是div相对于之前位置的移动 代码如下:(注意看绿色部分的解 ...

  7. 转:Redis 配置为 Service 系统服务

    在Linux中,将程序配置为服务后,就可以使用service命令对系统服务进行管理,如:start(启动).stop(停止).restart(重启)等.Redis安装后默认不会配置为系统服务,本文将介 ...

  8. LeetCode:60. Permutation Sequence,n全排列的第k个子列

    LeetCode:60. Permutation Sequence,n全排列的第k个子列 : 题目: LeetCode:60. Permutation Sequence 描述: The set [1, ...

  9. 转义字符及URI编码

    URL中的转义字符 当URL的参数中出现诸如+,空格,/,?,%,#,&,=等特殊字符串符号时,因为上述字符有特殊含义,导致服务器端无法正确解析参数. 解决办法:将这些字符转化成服务器可以识别 ...

  10. Struts2 控制文件上传下载

    之前介绍servlet3.0新特性的时候有提到过servlet API提供了一个part类来实现对文件的上传和保存,Struts其实是在其基础上做了进一步的封装,更加简单易用.至于文件下载,Strut ...