C# 调用cmd.exe的方法
网上有很多用C#调用cmd的方法,大致如下:
[c-sharp] view plaincopy
- private void ExecuteCmd(string command)
- {
- Process p = new Process();
- p.StartInfo.FileName = "cmd.exe";
- p.StartInfo.UseShellExecute = false;
- p.StartInfo.RedirectStandardInput = true;
- p.StartInfo.RedirectStandardOutput = true;
- p.StartInfo.CreateNoWindow = true;
- p.Start();
- p.StandardInput.WriteLine(command);
- p.StandardInput.WriteLine("exit");
- p.WaitForExit();
- this.textBox1.Text=textBox1.Text+ p.StandardOutput.ReadToEnd();
- p.Close();
- }
上面代码有几个不足,一是必须要exit那一句,否则就会死循环。 再就是每次执行Execute执行cmd后,都必须等到cmd执行完且cmd.exe进程退出,才能读到结果。有时候这样会让我们的应用程序失去操作的连续性。
事实上,通过两个线程,一个访问输入管道,一个访问输出管道,可以很容易实现持续性的效果,
下面是一个Console程序:
[c-sharp] view plaincopy
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using System.Diagnostics;
- namespace cmdtest
- {
- class Program
- {
- public static string cmd_str;
- public static string cmd_outstr;
- public static Process p = new Process();
- static void Main(string[] args)
- {
- p.StartInfo.FileName = "cmd.exe";
- p.StartInfo.UseShellExecute = false;
- p.StartInfo.RedirectStandardInput = true;
- p.StartInfo.RedirectStandardOutput = true;
- p.StartInfo.RedirectStandardError = true;
- p.StartInfo.CreateNoWindow = true;
- p.Start();
- cmd_str = "";
- cmd_outstr = "";
- Thread t1 = new Thread(new ThreadStart(DoCmdThread));
- t1.Start();
- Thread t2 = new Thread(new ThreadStart(OutCmdThread));
- t2.Start();
- while(true)
- {
- cmd_str = Console.ReadLine();
- Thread.Sleep(10);
- if (cmd_str == "exit")
- break;
- }
- }
- public static void DoCmdThread()
- {
- while (true)
- {
- if (cmd_str == "exit")
- break;
- if (cmd_str != "")
- {
- p.StandardInput.WriteLine(cmd_str);
- //p.StandardInput.WriteLine("cd");
- cmd_str = "";
- }
- Thread.Sleep(1);
- }
- }
- public static void OutCmdThread()
- {
- while (true)
- {
- if (cmd_str == "exit")
- {
- p.StandardInput.WriteLine("exit");
- p.WaitForExit();
- p.Close();
- break;
- }
- cmd_outstr = p.StandardOutput.ReadLine();
- while(cmd_outstr != "")
- {
- Console.WriteLine(cmd_outstr);
- cmd_outstr = p.StandardOutput.ReadLine();
- }
- char[] ch = new char[256];
- int c = p.StandardOutput.Read(ch, 0, 256);
- if (c > 0)
- {
- Console.Write(ch,0,c);
- }
- Thread.Sleep(1);
- }
- }
- }
- }
C# 调用cmd.exe的方法的更多相关文章
- C#程序调用cmd.exe执行命令
代码部分 using System.Diagnostics; public class CmdHelper { private static string CmdPath = @"C:\Wi ...
- Java 调用cmd.exe命令
原理:java的Runtime.getRuntime().exec(commandText)可以调用执行cmd指令. cmd /c dir 是执行完dir命令后关闭命令窗口. cmd /k dir 是 ...
- 调用cmd.exe执行pdf的合并(pdftk.exe)
今天调查一个pdf文件的抽取,合并功能,用到下面这个工具(pdftk): https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/ 在cmd.exe里执 ...
- C++程序中调用其他exe可执行文件方法
在编程过程中有个需求,点击某个按钮需要弹出系统的声音控制面板.在网上查了下代码中调用其他exe程序或者打开其他文件的方法. 自己借鉴网上的文章稍微总结下,加深下印象,也给方便自己用. 在代码中调用其他 ...
- Qt之启动外部程序(调用cmd.exe ping putty winscp 管道等等,比较牛叉)
http://blog.csdn.net/u011012932/article/details/50478833
- 在IIS7.5中ASP.NET调用cmd程序拒绝访问决绝方法小记
前言 昨天利用Github的Webhook实现自动部署站点,其中要调用命令行(cmd.exe)程序执行shell脚本. 在本地测试没有任何问题,部署到服务器之后,发现错误信息:访问拒绝. 问题 没有权 ...
- C# 调用cmd命令行路径中带空格问题
今天打包winform程序,程序中本身有一处需要调用cmd.exe,打包安装在C:\Program Files目录下,然后调用cmd的地方,就弹出了C:\Program不是内部或外部命令,也不是可运行 ...
- C#程序调用cmd执行命令
对于C#通过程序来调用cmd命令的操作,网上有很多类似的文章,但很多都不行,竟是漫天的拷贝.我自己测试整理了一下. 代码: string str = Console.ReadLine(); Syste ...
- C#程序调用cmd执行命令(转)
C#通过程序来调用cmd命令的操作 string str = Console.ReadLine(); System.Diagnostics.Process p = new System.Diagnos ...
随机推荐
- [进程通信] Linux进程间通信(IPC)
简介 linux下进程间通信的几种主要手段: 1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道 ...
- Android自定义评分控件:RatingStarView
RatingStarView Android自定义的评分控件,类似ProgressBar那样的,使用星星图标(full.half.empty)作为progress标识的评分/打分控件. 效果图 图1: ...
- IOS(二)基本控件UIButton、简易动画、transform属性、UIImageView
UIButton //1.设置UIButton 的左右移动 .center属性 获得 CGPoint 来修改x y //1.设置UIButton 的放大缩小 bounds属性 获得CGRect 然后通 ...
- mysql的一些使用操作
1:如果空闲时间很长导致mysql报错: Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last pa ...
- 转csdn-css4
http://www.csdn.net/article/2015-03-06/2824127-css4
- c# 内存的具体表现- 通用类型系统 深拷贝 浅拷贝 函数传参
c# 通用类型系统 及变量在 深拷贝 浅拷贝 函数传参 中的深层次的表现 在编程中遇到了一些想不到的异常,跟踪发现,自己对于c#变量在内存上的表现理解有偏差,系统的学习并通过代码实验梳理了各种情况下, ...
- Haproxy------在windows下配置负载均衡
配置Haproxy 1.解压Haproxy到d:\haproxy 2.置haproxy.cfg文件 global log 127.0.0.1 local0 maxconn 1500 daemon de ...
- PHP 中级内容
1.面向对象编程(OOP) 2.模板引擎(smarty) 3.MYSQL(中级操作) 数据库抽象层(PDO): 4.Ajax(异步刷新) 5.Js框架(jQuery) Xml+JSON数据 ...
- Java并发编程:Callable、Future和FutureTask的实现
启动线程执行任务,如果需要在任务执行完毕之后得到任务执行结果,可以使用从Java 1.5开始提供的Callable和Future 下面就分析一下Callable.Future以及FutureTask的 ...
- VS2010 使用 EF5 框架步骤
1.安装 nuget , 在nuget里联机查找 EF 5.x DbContext Generator for C# 模版下载安装 2.nuget 控制台执行 Install-Package Enti ...