zoukankan      html  css  js  c++  java
  • c#执行Dos命令

    实现执行CMD命令的核心代码(Cmd.cs):
    
    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[] { '
    ', '
    ' }, 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[] { '
    ', '
    ' }, 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 + "
    ");
            }
            /// <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 + "
    ");
                }
            }
            /// <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;
            }
     
        }
    }
    
    
  • 相关阅读:
    剑指Offer——翻转单词顺序列
    剑指Offer——左旋转字符串
    剑指Offer——和为S的两个数字
    剑指Offer——和为S的连续正数序列
    剑指Offer——数组中只出现一次的数字
    log4cxx入门第一篇--一个小例子
    gsoap写一个c++ webservice
    Protocol Buffer技术详解(数据编码)
    Protocol Buffer技术详解(Java实例)
    Protocol Buffer技术详解(C++实例)
  • 原文地址:https://www.cnblogs.com/profession/p/12605011.html
Copyright © 2011-2022 走看看