首页 > 学院 > 开发设计 > 正文

一个执行Dos命令的窗口程序,与各位分享。

2019-11-17 02:43:01
字体:
来源:转载
供稿:网友
一个执行Dos命令的窗口程序,与各位分享。

一个执行Dos命令的窗口程序,与各位分享。

效果图:具体实现在代码中有详细的注释,请看代码。实现执行CMD命令的核心代码(Cmd.cs):[csharp] using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.Threading; using System.Management; using System.Globalization; namespace Zbsoft.ExtendFunction { public class Cmd { /// <summary> /// 是否终止调用CMD命令执行 /// </summary> PRivate static bool invokeCmdKilled = true; /// <summary> /// 获取或设置是否终止调用CMD命令执行 /// </summary> public static bool InvokeCmdKilled { get { return invokeCmdKilled; } set { invokeCmdKilled = value; if (invokeCmdKilled) { if (p != null && !p.HasExited) { killProcess(p.Id); } } } } private static Process p; private static Action<string> RefreshResult; /// <summary> /// 调用CMD命令,执行指定的命令,并返回命令执行返回结果字符串 /// </summary> /// <param name="cmdArgs">命令行</param> /// <param name="RefreshResult">刷新返回结果字符串的事件</param> /// <returns></returns> public static void InvokeCmd(string cmdArgs, Action<string> pRefreshResult = null) { InvokeCmdKilled = false; RefreshResult = pRefreshResult; if (p != null) { p.Close(); p = null; } p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived); p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived); p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.CreateNoWindow = true; p.Start(); p.BeginErrorReadLine(); p.BeginOutputReadLine(); string[] cmds = cmdArgs.Split(new char[] { '/r', '/n' }, StringSplitOptions.RemoveEmptyEntries); foreach (var v in cmds) { Thread.Sleep(200); p.StandardInput.WriteLine(v); } //p.StandardInput.WriteLine("exit"); p.WaitForExit(); p.Dispose(); p.Close(); p = null; InvokeCmdKilled = true; } /// <summary> /// 输入交互式命令 /// </summary> /// <param name="cmd"></param> public static void InputCmdLine(string cmd) { if (p == null) return; string[] cmds = cmd.Split(new char[] { '/r', '/n' }, StringSplitOptions.RemoveEmptyEntries); foreach (var v in cmds) { Thread.Sleep(200); p.StandardInput.WriteLine(v); } } /// <summary> /// 异步读取标准输出信息 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> static void p_OutputDataReceived(object sender, DataReceivedEventArgs e) { if (RefreshResult != null && e.Data != null) RefreshResult(e.Data + "/r/n"); } /// <summary> /// 异步读取错误消息 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> static void p_ErrorDataReceived(object sender, DataReceivedEventArgs e) { if (RefreshResult != null && e.Data != null) { RefreshResult(e.Data + "/r/n"); } } /// <summary> /// 关闭指定进程ID的进程以及子进程(关闭进程树) /// </summary> /// <param name="id"></param> public static void FindAndKillProcess(int id) { killProcess(id); } /// <summary> /// 关闭指定进程名称的进程以及子进程(关闭进程树) /// </summary> /// <param name="name"></param> public static void FindAndKillProcess(string name) { foreach (Process clsProcess in Process.GetProcesses()) { if ((clsProcess.ProcessName.StartsWith(name, StringComparison.CurrentCulture)) || (clsProcess.MainWindowTitle.StartsWith(name, StringComparison.CurrentCulture))) killProcess(clsProcess.Id); } } /// <summary> /// 关闭进程树 /// </summary> /// <param name="pid"></param> /// <returns></returns> private static bool killProcess(int pid) { Process[] procs = Process.GetProcesses(); for (int i = 0; i < procs.Length; i++) { if (getParentProcess(procs[i].Id) == pid) killProcess(procs[i].Id); } try { Process myProc = Process.GetProcessById(pid); myProc.Kill(); } //进程已经退出 catch (ArgumentException) { ; } return true; } /// <summary> /// 获取父进程ID /// </summary> /// <param name="Id"></param> /// <returns></returns> private static int getParentProcess(int Id) { int parentPid = 0; using (ManagementObject mo = new ManagementObject("win32_process.handle='" + Id.ToString(CultureInfo.InvariantCulture) + "'")) { try { mo.Get(); } catch (ManagementException) { return -1; } parentPid = Convert.ToInt32(mo["ParentProcessId"], CultureInfo.InvariantCulture); } return parentPid; } } } 调用上述核心类的窗口代码(Form2.cs):[csharp] using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace Zbsoft.Test { public partial class Form2 : Form { Thread cmdThread; private Action<string> rf; public Form2() { InitializeComponent(); } /// <summary> /// 按CTRL+Enter键开始执行命令 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { if (e.KeyCode == Keys.Enter && e.Control) { if (this.button3.Enabled) this.button3_Click(null, null); else this.button4_Click(null, null); } } private void Form2_Load(object sender, EventArgs e) { this.textBox1.Text = "help/r/ndir/r/nping 127.0.0.1"; rf = this.refreshCmdTxt; this.richTextBox1.AppendText("Dos命令执行程序,支持批命令执行。按Ctrl+Enter键开始执行。如果一个命令长时间不能结束的,如ping 127.0.0.1 -t,“停止执行”按钮可强制终止执行。/r/n"); this.richTextBox1.AppendText("/r/n你的网卡Mac地址:" + Zbsoft.ExtendFunction.HardwareInfo.getID_NetCardId()); this.richTextBox1.AppendText(",Cpu序列号:" + Zbsoft.ExtendFunction.HardwareInfo.getID_CpuId()); this.richTextBox1.AppendText(",硬盘序列号:" + Zbsoft.ExtendFunction.HardwareInfo.getID_HardDiskId() + "/r/n"); this.richTextBox1.AppendText("/r/n常用的命令:/r/n"); this.richTextBox1.AppendText(@" ASSOC 显示或修改文件扩展名关联。 ATTRIB 显示或更改文件属性。 BREAK 设置或清除扩展式 CTRL+C 检查。 BCDEDIT 设置启动数据库中的属性以控制启动加载。 CACLS 显示或修改文件的访问控制列表(ACL)。 CALL 从另一个批处理程序调用这一个。 CD 显示当前目录的名称或将其更改。 CHCP 显示或设置活动代码页数。 CHDIR 显示当前目录的名称或将其更改。 CHKDSK 检查磁盘并显示状态报告。 CHKNTFS 显示或修改启动时间磁盘检查。 CLS 清除屏幕。 CMD 打开另一个 Windows 命令解释程序窗口。 COLOR 设置默认控制台前景和背景颜色。 COMP 比较两个或两套文件的内容。 COMPACT 显示或更改 NTFS 分区上文件的压缩。 CONVERT 将 FAT 卷转换成 NTFS。您不能转换当前驱动器。 COPY 将至少一个文件复制到另一个位置。 DATE 显示或设置日期。 DEL 删除至少一个文件。 DIR 显示一个目录中的文件和子目录。 DISKCOMP 比较两个软盘的内容。 DISKCOPY 将一个软盘的内容复制到另一个软盘。 DISKPART 显示或配置磁盘分区属性。 DOSKEY 编辑命令行、调用 Windows 命令并创建宏。 DRIVERQUERY 显示当前设备驱动程序状态和属性。 ECHO 显示消息,或将命令回显打开或关上。 ENDLOCAL 结束批文件中环境更改的本地化。 ERASE 删除一个或多个文件。 EXIT 退出 CMD.EXE 程序(命令解释程序)。 FC 比较两个文件或两个文件集并显示它们之间的不同。 FIND 在一个或多个文件中搜索一个文本字符串。 FINDSTR 在多个文件中搜索字符串。 FOR 为一套文件中的每个文件运行一个指定的命令。 FORMAT 格式化磁盘,以便跟 Windows 使用。 FSUTIL 显示或配置文件系统的属性。 FTY
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表