本文以一个简单的小例子讲解如何将命令行信息实时的输出到文本框中。仅供学习分享使用,如有不足之处,还请指正。

概述

在C#程序开发过程中,有时需要运行其它的程序并获得输出的结果来进行进一步的处理。一般第三方的程序,主要通过进程来调用,如果能够获取第三方程序执行过程中的信息,就显得方便而有用。

涉及知识点:

  • 进程相关类: Process,ProcessStartInfo,主要设置进程的重定向输出,以及接受数据的事件。
  • 文本框操作:多行显示,滚动条总在最下面

效果图

如下【如果命令执行完毕,会自动结束,如果中断进程,可以手动点击结束进程】:

核心代码

主要代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Diagnostics;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Runtime.InteropServices;
  9. using System.Text;
  10. using System.Threading;
  11. using System.Threading.Tasks;
  12. using System.Windows.Forms;
  13.  
  14. namespace DemoBat
  15. {
  16. public partial class MainForm : Form
  17. {
  18. private BatStatus curBatSataus = BatStatus.NONE;
  19.  
  20. private Process curProcess = new Process();
  21.  
  22. public MainForm()
  23. {
  24. InitializeComponent();
  25. }
  26.  
  27. private void MainForm_Load(object sender, EventArgs e)
  28. {
  29. InitInfo();
  30. }
  31.  
  32. private void InitInfo()
  33. {
  34. curProcess.OutputDataReceived -= new DataReceivedEventHandler(ProcessOutDataReceived);
  35. ProcessStartInfo p = new ProcessStartInfo();
  36. p.FileName = "cmd.exe";
  37. //p.Arguments = " -t 192.168.1.103";
  38. p.UseShellExecute = false;
  39. p.WindowStyle = ProcessWindowStyle.Hidden;
  40. p.CreateNoWindow = true;
  41. p.RedirectStandardError = true;
  42. p.RedirectStandardInput = true;
  43. p.RedirectStandardOutput = true;
  44. curProcess.StartInfo = p;
  45. curProcess.Start();
  46.  
  47. curProcess.BeginOutputReadLine();
  48. curProcess.OutputDataReceived += new DataReceivedEventHandler(ProcessOutDataReceived);
  49. }
  50.  
  51. /// <summary>
  52. /// 开始命令行
  53. /// </summary>
  54. /// <param name="sender"></param>
  55. /// <param name="e"></param>
  56. private void btnStart_Click(object sender, EventArgs e)
  57. {
  58. if (string.IsNullOrEmpty(this.txtCommand.Text.Trim()))
  59. {
  60. MessageBox.Show("请输入命令");
  61. }
  62. if (curBatSataus != BatStatus.ON)
  63. {
  64. curProcess.StandardInput.WriteLine(this.txtCommand.Text.Trim());
  65. curBatSataus = BatStatus.ON;
  66. }
  67. else {
  68. MessageBox.Show("当前进程正在运行,请先关闭");
  69. }
  70.  
  71. }
  72.  
  73. /// <summary>
  74. /// 结束命令行
  75. /// </summary>
  76. /// <param name="sender"></param>
  77. /// <param name="e"></param>
  78. private void btnStop_Click(object sender, EventArgs e)
  79. {
  80. if (curBatSataus == BatStatus.ON)
  81. {
  82. curProcess.CancelOutputRead();//取消异步操作
  83. curProcess.Kill();
  84. curBatSataus = BatStatus.OFF;
  85. //如果需要手动关闭,则关闭后再进行初始化
  86. InitInfo();
  87. }
  88. }
  89.  
  90. /// <summary>
  91. /// 进程接受事件
  92. /// </summary>
  93. /// <param name="sender"></param>
  94. /// <param name="e"></param>
  95. public void ProcessOutDataReceived(object sender, DataReceivedEventArgs e)
  96. {
  97. if (this.txtOutPutInfo.InvokeRequired)
  98. {
  99. this.txtOutPutInfo.Invoke(new Action(() =>
  100. {
  101. this.txtOutPutInfo.AppendText(e.Data + "\r\n");
  102. }));
  103. }
  104. else {
  105. this.txtOutPutInfo.AppendText(e.Data + "\r\n");
  106. }
  107. }
  108.  
  109. private void timer1_Tick(object sender, EventArgs e)
  110. {
  111. if ((string.IsNullOrEmpty(this.curProcess.StartInfo.FileName) || this.curProcess.StandardInput.BaseStream.CanWrite) && curBatSataus != BatStatus.OFF)
  112. {
  113. curBatSataus = BatStatus.OFF;
  114.  
  115. }
  116. }
  117.  
  118. }
  119.  
  120. /// <summary>
  121. /// 命令状态
  122. /// </summary>
  123. public enum BatStatus {
  124. NONE = ,
  125. ON = ,
  126. OFF =
  127. }
  128. }

备注:

关于如何在命令行执行过程中【如:Ping 192.168.1.100 -t】,键入快捷键【如:Ctrl+C】等操作,目前还没有实现。目前采用的就强制关闭进程方法

源码下载

C# 动态输出Dos命令执行结果的更多相关文章

  1. python输出shell命令执行结果

    import os,subprocess p = subprocess.Popen("df -h", shell=True, stdout=subprocess.PIPE) out ...

  2. dos命令执行mysql的sql文件

    1.cmd进入dos窗口 2.输入cd+ mysql的bin目录后进入bin文件下 3.进入控制台:mysql -uroot -proot  回车 4.选择数据库:use mydata go 回车 5 ...

  3. Dos命令完成文件拷贝

    Dos命令初阶--文件拷贝 1.XCOPY命令 可以在cmd中录入:XCOPY /? 即可查看帮助 帮助: XCOPY Microsoft Windows [版本 6.2.9200] (c) 2012 ...

  4. infa dos命令

    informatica8.6用dos命令执行作业的命令: pmcmd startworkflow -sv integration -d Domain_BlueBreezeq -u Administra ...

  5. Python3执行DOS命令并截取其输出到一个列表字符串,同时写入一个文件

    #执行DOS命令并截取其输出到一个列表字符串,同时写入一个文件#这个功能很有用listing=os.popen('ipconfig').readlines()for i in listing: pri ...

  6. C#执行外部程序之执行DOS命令和批处理

    在项目开发中,有时候要处理一些文件,比如视频格式的转换,如果用C开发一套算法,再用C#调用,未免得不偿失!有时候调用现有的程序反而更加方便.今天就来说一下C#中如何调用外部程序,执行一些特殊任务. 这 ...

  7. C#执行DOS命令(CMD命令)

    在c#程序中,有时会用到调用cmd命令完成一些功能,于是在网上查到了如下方法,实现了c#执行DOS命令,并返回结果.         //dosCommand Dos命令语句         publ ...

  8. 在.net中悄悄执行dos命令,并获取执行的结果(转)

    一.怎样使dos命令悄悄执行,而不弹出控制台窗口? 1.需要执行带“/C”参数的“cmd.exe”命令,它表示执行完命令后立即退出控制台.2.设置startInfo.UseShellExecute = ...

  9. c#执行Dos命令

    一个执行Dos命令的窗口程序,与各位分享.   效果图:     具体实现在代码中有详细的注释,请看代码.   实现执行CMD命令的核心代码(Cmd.cs):   [csharp]   using S ...

随机推荐

  1. linux查看系统32位还是64位

    1. 从系统查看 1.1 uname -a 命令 [root@qs-dmm-rh2 ~]# uname -a Linux qs-dmm-rh2 2.6.18-194.el5 #1 SMP Tue Ma ...

  2. npm包实现发布正式和测试版

    npm publish的時候 怎麽發測試版和正式版本呢? 通常我們一般情況下 直接 npm publish 提交自己的開發包后,在項目中 npm install @packageName 是下載下來剛 ...

  3. mysql 开发进阶篇系列 45 物理备份与恢复(xtrabackup 安装,用户权限,配置)

    一. 安装说明 安装XtraBackup 2.4 版本有三种方式: (1) 存储库安装Percona XtraBackup(推荐) (2 )下载的rpm或apt包安装Percona XtraBacku ...

  4. sql server 索引阐述系列六 碎片查看与解决方案

    一 . dm_db_index_physical_stats 重要字段说明 1.1 内部碎片:是avg_page_space_used_in_percent字段.是指页的填充度,为了使磁盘使用状况达到 ...

  5. Android View 的事件分发原理解析

    作为一名 Android 开发者,每天接触最多的就是 View 了.Android View 虽然不是四大组件,但其并不比四大组件的地位低.而 View 的核心知识点事件分发机制则是不少刚入门同学的拦 ...

  6. laypage 物理分页与逻辑分页实例

    前言 以下介绍摘自 layui官网laypage layPage 致力于提供极致的分页逻辑,既可轻松胜任异步分页,也可作为页面刷新式分页.自 layui 2.0 开始,无论是从核心代码还是API设计, ...

  7. 机器学习笔记(5) KNN算法

    这篇其实应该作为机器学习的第一篇笔记的,但是在刚开始学习的时候,我还没有用博客记录笔记的打算.所以也就想到哪写到哪了. 你在网上搜索机器学习系列文章的话,大部分都是以KNN(k nearest nei ...

  8. SELECT INTO和INSERT INTO SELECT的区别

    数据库中的数据复制备份 SELECT INTO: 形式: SELECT value1,value2,value3 INTO Table_2 FROM Table_1 Table_2表存在,报错:数据库 ...

  9. [转]Docker(三):Dockerfile 命令详解

    本文转自:https://blog.csdn.net/ityouknow/article/details/79600406 上一篇文章Docker(二):Dockerfile 使用介绍介绍了 Dock ...

  10. mysql 数据库的备份与还原 at winows

    把cmd的当前目录切换到mysql安装目录; 备份数据库world mysqldump -u root -p  world < c:\all.sql 导入数据库 新建schema world 常 ...