服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C# 动态输出Dos命令执行结果的实例(附源码)

C# 动态输出Dos命令执行结果的实例(附源码)

2022-09-24 15:33Alan.hsiang C#

这篇文章主要介绍了C# 动态输出Dos命令执行结果的实例,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

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

概述

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

涉及知识点:

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

效果图

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

C# 动态输出Dos命令执行结果的实例(附源码)

核心代码

主要代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
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 = 0,
  ON = 1,
  OFF = 2
 }
}

备注:

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

源码下载

以上就是C# 动态输出Dos命令执行结果的实例(附源码)的详细内容,更多关于C# 动态输出Dos命令执行结果的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/hsiang/p/6596276.html

延伸 · 阅读

精彩推荐
  • C#C#发送HttpPost请求来调用WebService的方法

    C#发送HttpPost请求来调用WebService的方法

    在C#中发送HttpPost请求来调用WebService中的MyAction方法,代码如下:需要的朋友可以参考一下...

    C#教程网10042020-12-18
  • C#C#实现Access通用访问类OleDbHelper完整实例

    C#实现Access通用访问类OleDbHelper完整实例

    这篇文章主要介绍了C#实现Access通用访问类OleDbHelper,结合完整实例形式分析了C#针对access数据库的连接、查询、遍历、分页显示等相关操作技巧,需要的朋友...

    蓝之风7912021-12-27
  • C#C#访问及调用类中私有成员与方法示例代码

    C#访问及调用类中私有成员与方法示例代码

    访问一个类的私有成员不是什么好做法,大家也都知道私有成员在外部是不能被访问的,这篇文章主要给大家介绍了关于C#访问及调用类中私有成员与方法...

    cnc4732022-02-24
  • C#unity绘制一条流动的弧线(贝塞尔线)

    unity绘制一条流动的弧线(贝塞尔线)

    这篇文章主要为大家详细介绍了unity绘制一条流动弧线的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    BBoy_Leon5082022-09-15
  • C#C#排序算法之快速排序解析

    C#排序算法之快速排序解析

    这篇文章主要为大家详细介绍了C#排序算法之快速排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    mlovelcottage6302022-08-20
  • C#如何使用VS中的快捷键快速格式化代码使好看,整齐

    如何使用VS中的快捷键快速格式化代码使好看,整齐

    这篇文章主要介绍了如何使用VS中的快捷键快速格式化代码使好看,整齐,非常不错具有一定的参考借鉴价值,需要的朋友可以参考下...

    风口上的猪20154522022-08-31
  • C#C#设置软件开机自动运行的方法(修改注册表)

    C#设置软件开机自动运行的方法(修改注册表)

    这篇文章主要介绍了C#设置软件开机自动运行的方法,通过简单修改注册表开机启动项实现软件的开机启动功能,非常简单实用,需要的朋友可以参考下...

    smartsmile201211062021-11-29
  • C#谈C# using的用法与好处

    谈C# using的用法与好处

    这篇文章主要为大家详细介绍了C# using的用法与好处,具体分析了using指令调用的Dispose()方法,感兴趣的朋友可以参考一下...

    net小伙10902021-11-21