天天看點

c#執行Dos指令

c#執行Dos指令

一個執行Dos指令的視窗程式,與各位分享。

效果圖:

c#執行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;

}

}