using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.Linq; using System.Management; using System.Text; using System.Threading; using System.Threading.Tasks; namespace FileExplorer { public class Cmd { /// /// 是否终止调用CMD命令执行 /// private static bool invokeCmdKilled = true; /// /// 获取或设置是否终止调用CMD命令执行 /// 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 RefreshResult; /// /// 调用CMD命令,执行指定的命令,并返回命令执行返回结果字符串 /// /// 命令行 /// 刷新返回结果字符串的事件 /// public static void InvokeCmd(string cmdArgs, Action 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(); p.StandardInput.WriteLine(cmdArgs); } /// /// 异步读取标准输出信息 /// /// /// static void p_OutputDataReceived(object sender, DataReceivedEventArgs e) { if (e.Data != null) { if (e.Data.Length > 5) { if (e.Data.LastIndexOf("Total") > -1)// .f.Substring(5)== "Total") { // // ModelBasic.ErrDef.iErrHandler.ErrInfoTransmit("【导出完成】 " + e.Data); } } } } /// /// 异步读取错误消息 /// /// /// static void p_ErrorDataReceived(object sender, DataReceivedEventArgs e) { if ( e.Data != null) { // // ModelBasic.ErrDef.iErrHandler.ErrInfoTransmit("【导出错误】"+ e.Data); } else { // // ModelBasic.ErrDef.iErrHandler.ErrInfoTransmit("【导出错误】但是错误原因是空值!"); } } /// /// 关闭指定进程ID的进程以及子进程(关闭进程树) /// /// public static void FindAndKillProcess(int id) { killProcess(id); } /// /// 关闭指定进程名称的进程以及子进程(关闭进程树) /// /// 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); } } /// /// 关闭进程树 /// /// /// 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 (Exception err) { LogNet.LogisTrac.WriteLog(typeof(Cmd), err); ; } return true; } /// /// 获取父进程ID /// /// /// 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 (Exception err) { LogNet.LogisTrac.WriteLog(typeof(Cmd), err); return -1; } parentPid = Convert.ToInt32(mo["ParentProcessId"], CultureInfo.InvariantCulture); } return parentPid; } } }