C# 动态输出Dos命令执行结果
本文以一个简单的小例子讲解如何将命令行信息实时的输出到文本框中。仅供学习分享使用,如有不足之处,还请指正。
概述
在C#程序开发过程中,有时需要运行其它的程序并获得输出的结果来进行进一步的处理。一般第三方的程序,主要通过进程来调用,如果能够获取第三方程序执行过程中的信息,就显得方便而有用。
涉及知识点:
- 进程相关类: Process,ProcessStartInfo,主要设置进程的重定向输出,以及接受数据的事件。
- 文本框操作:多行显示,滚动条总在最下面
效果图
如下【如果命令执行完毕,会自动结束,如果中断进程,可以手动点击结束进程】:
核心代码
主要代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms; namespace DemoBat
{
public partial class MainForm : Form
{
private BatStatus curBatSataus = BatStatus.NONE; private Process curProcess = new Process(); public MainForm()
{
InitializeComponent();
} private void MainForm_Load(object sender, EventArgs e)
{
InitInfo();
} private void InitInfo()
{
curProcess.OutputDataReceived -= new DataReceivedEventHandler(ProcessOutDataReceived);
ProcessStartInfo p = new ProcessStartInfo();
p.FileName = "cmd.exe";
//p.Arguments = " -t 192.168.1.103";
p.UseShellExecute = false;
p.WindowStyle = ProcessWindowStyle.Hidden;
p.CreateNoWindow = true;
p.RedirectStandardError = true;
p.RedirectStandardInput = true;
p.RedirectStandardOutput = true;
curProcess.StartInfo = p;
curProcess.Start(); curProcess.BeginOutputReadLine();
curProcess.OutputDataReceived += new DataReceivedEventHandler(ProcessOutDataReceived);
} /// <summary>
/// 开始命令行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStart_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(this.txtCommand.Text.Trim()))
{
MessageBox.Show("请输入命令");
}
if (curBatSataus != BatStatus.ON)
{
curProcess.StandardInput.WriteLine(this.txtCommand.Text.Trim());
curBatSataus = BatStatus.ON;
}
else {
MessageBox.Show("当前进程正在运行,请先关闭");
} } /// <summary>
/// 结束命令行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStop_Click(object sender, EventArgs e)
{
if (curBatSataus == BatStatus.ON)
{
curProcess.CancelOutputRead();//取消异步操作
curProcess.Kill();
curBatSataus = BatStatus.OFF;
//如果需要手动关闭,则关闭后再进行初始化
InitInfo();
}
} /// <summary>
/// 进程接受事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void ProcessOutDataReceived(object sender, DataReceivedEventArgs e)
{
if (this.txtOutPutInfo.InvokeRequired)
{
this.txtOutPutInfo.Invoke(new Action(() =>
{
this.txtOutPutInfo.AppendText(e.Data + "\r\n");
}));
}
else {
this.txtOutPutInfo.AppendText(e.Data + "\r\n");
}
} private void timer1_Tick(object sender, EventArgs e)
{
if ((string.IsNullOrEmpty(this.curProcess.StartInfo.FileName) || this.curProcess.StandardInput.BaseStream.CanWrite) && curBatSataus != BatStatus.OFF)
{
curBatSataus = BatStatus.OFF; }
} } /// <summary>
/// 命令状态
/// </summary>
public enum BatStatus {
NONE = ,
ON = ,
OFF =
}
}
备注:
关于如何在命令行执行过程中【如:Ping 192.168.1.100 -t】,键入快捷键【如:Ctrl+C】等操作,目前还没有实现。目前采用的就强制关闭进程方法
C# 动态输出Dos命令执行结果的更多相关文章
- python输出shell命令执行结果
import os,subprocess p = subprocess.Popen("df -h", shell=True, stdout=subprocess.PIPE) out ...
- dos命令执行mysql的sql文件
1.cmd进入dos窗口 2.输入cd+ mysql的bin目录后进入bin文件下 3.进入控制台:mysql -uroot -proot 回车 4.选择数据库:use mydata go 回车 5 ...
- Dos命令完成文件拷贝
Dos命令初阶--文件拷贝 1.XCOPY命令 可以在cmd中录入:XCOPY /? 即可查看帮助 帮助: XCOPY Microsoft Windows [版本 6.2.9200] (c) 2012 ...
- infa dos命令
informatica8.6用dos命令执行作业的命令: pmcmd startworkflow -sv integration -d Domain_BlueBreezeq -u Administra ...
- Python3执行DOS命令并截取其输出到一个列表字符串,同时写入一个文件
#执行DOS命令并截取其输出到一个列表字符串,同时写入一个文件#这个功能很有用listing=os.popen('ipconfig').readlines()for i in listing: pri ...
- C#执行外部程序之执行DOS命令和批处理
在项目开发中,有时候要处理一些文件,比如视频格式的转换,如果用C开发一套算法,再用C#调用,未免得不偿失!有时候调用现有的程序反而更加方便.今天就来说一下C#中如何调用外部程序,执行一些特殊任务. 这 ...
- C#执行DOS命令(CMD命令)
在c#程序中,有时会用到调用cmd命令完成一些功能,于是在网上查到了如下方法,实现了c#执行DOS命令,并返回结果. //dosCommand Dos命令语句 publ ...
- 在.net中悄悄执行dos命令,并获取执行的结果(转)
一.怎样使dos命令悄悄执行,而不弹出控制台窗口? 1.需要执行带“/C”参数的“cmd.exe”命令,它表示执行完命令后立即退出控制台.2.设置startInfo.UseShellExecute = ...
- c#执行Dos命令
一个执行Dos命令的窗口程序,与各位分享. 效果图: 具体实现在代码中有详细的注释,请看代码. 实现执行CMD命令的核心代码(Cmd.cs): [csharp] using S ...
随机推荐
- Python You-Get (送你一个免广告的视频和音乐网站 VIP)
You-get可以在仅仅提供URL情况下就可以实现下载视频.图片.音乐等信息.也可以通过播放器在线观看视频或听音乐,重要的是再也不用烦恼弹出的广告了,如果你想观看视频,但又不想观看广告,并且你还想把视 ...
- Jenkins问题记录:android构建时提示Unzipping /home/.gradle/wrapper/dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9/gradle-3.3-all.zip to /home/.gradle/wrapper/dists/gradle-3.3-all/55gk2rcmfc6p2dg9u9ohc3hw9 Except
-------------- -------------- 问题:今日job构建报出如下错误: Unzipping /home/.gradle/wrapper/dists/gradle-3.3-all ...
- java与json,一篇就够了
本示例使用的json包为阿里的fastjson 首先写三个工具类(seter和geter方法省略,自行补上): /** * 屏幕实体类 */ public class Screen { private ...
- C++—程序的内存分区
代码区 程序被操作系统加载到内存时,所有可执行的代码被加载到代码区,也叫代码段,存储程序的代码指令.程序运行时,这段区域数据不可被修改只可以被执行. 静态区 程序中的静态变量.全局变量存放在此 ...
- C++ STL中的map用红黑树实现,搜索效率是O(lgN),为什么不像python一样用散列表从而获得常数级搜索效率呢?
C++ STL中的标准规定: map, 有序 unordered_map,无序,这个就是用散列表实现 谈谈hashmap和map的区别,我们知道hashmap是平均O(1),map是平均O(lnN)的 ...
- How Tomcat works — 三、tomcat启动(2)
在了解了tomcat 的一些基本组件之后,学习启动过程就更容易理解了,因为启动过程就是启动各个组件. 目录 启动顺序 Bootstrap类 Catalina类 StandardServer类和Stan ...
- 在.net core 中PetaPoco结合EntityFrameworkCore使用codefirst方法进行开发
在.net core开发过程中,使用最多的就是注入方法.但是在.net core使用PetaPoco时,PetaPoco还不支持进行注入方式进行处理一些问题. 今天对PetaPoco进行了一些扩展,可 ...
- (转)Spring4.0:@Configuration
从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或者多个被@Bean注解的方法,这些方法将会被AnnotationConfigAppli ...
- Docker镜像管理基础与基于容器的镜像制作示例
一.Docker镜像 Docker镜像是启动Docker容器的一个非常重要的组件.Docker各组件之间的关系如图: Docker镜像含有启动容器所需要的文件系统及其内容,因此Docker镜像用于创建 ...
- Swagger中配置了@ApiModelProperty的allowableValues属性但不显示的问题
现在用Swagger来生成API文档的例子已经非常多了,今天碰到开发同事问了一个问题,帮着看了一下,主要还是配置方法的问题,所以记录一下.如果您也碰到了同样的问题,希望本文对您有用. 问题描述 @Ap ...