这篇文章主要介绍了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 = 0,
ON = 1,
OFF = 2
}
}
备注:
关于如何在命令行执行过程中【如:Ping 192.168.1.100 -t】,键入快捷键【如:Ctrl+C】等操作,目前还没有实现。目前采用的就强制关闭进程方法
源码下载
以上就是C# 动态输出Dos命令执行结果的实例(附源码)的详细内容,更多关于C# 动态输出Dos命令执行结果的资料请关注得得之家其它相关文章!
沃梦达教程
本文标题为:C# 动态输出Dos命令执行结果的实例(附源码)
基础教程推荐
猜你喜欢
- C# List实现行转列的通用方案 2022-11-02
- C# windows语音识别与朗读实例 2023-04-27
- winform把Office转成PDF文件 2023-06-14
- 一个读写csv文件的C#类 2022-11-06
- C#类和结构详解 2023-05-30
- C# 调用WebService的方法 2023-03-09
- C#控制台实现飞行棋小游戏 2023-04-22
- ZooKeeper的安装及部署教程 2023-01-22
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- unity实现动态排行榜 2023-04-27