摘要
在C#中,有時(shí)需要執(zhí)行命令行指令來完成特定的任務(wù),這個(gè)用起來特別簡單,用好了靈活性極大。這可能包括運(yùn)行腳本、管理服務(wù)、獲取系統(tǒng)信息等。C# 提供了 System.Diagnostics
命名空間中的 Process
類來啟動(dòng)和管理系統(tǒng)進(jìn)程,包括命令行窗口(cmd.exe)。
正文
應(yīng)用場景
自動(dòng)化構(gòu)建和部署:使用命令行工具如 MSBuild 或者 PowerShell 腳本來編譯和部署應(yīng)用程序。
系統(tǒng)管理:執(zhí)行系統(tǒng)管理任務(wù),如啟動(dòng)或停止服務(wù),管理文件和目錄等。
網(wǎng)絡(luò)操作:運(yùn)行網(wǎng)絡(luò)診斷工具如 ping、ipconfig 或自定義網(wǎng)絡(luò)操作腳本。
數(shù)據(jù)庫操作:執(zhí)行數(shù)據(jù)庫備份、還原或運(yùn)行 SQL 腳本。
第三方工具集成:調(diào)用 Git、Docker 或其他命令行工具進(jìn)行自動(dòng)化操作。
示例 1: 執(zhí)行簡單命令
public class CmdExample
{
public static void ExecuteCommand(string command)
{
ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd", $"/c {command}")
{
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
using (Process process = Process.Start(processStartInfo))
{
using (StreamReader reader = process.StandardOutput)
{
string result = reader.ReadToEnd();
Console.WriteLine(result);
}
}
}
}
使用此方法可以執(zhí)行任何簡單的命令行指令。例如,獲取當(dāng)前目錄下的文件列表:
static void Main()
{
CmdExample.ExecuteCommand("dir");
}
示例 2: 運(yùn)行批處理腳本
public class BatchScriptRunner
{
public static void RunBatchScript(string scriptPath)
{
ProcessStartInfo processStartInfo = new ProcessStartInfo(scriptPath)
{
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
using (Process process = Process.Start(processStartInfo))
{
using (StreamReader reader = process.StandardOutput)
{
string result = reader.ReadToEnd();
Console.WriteLine(result);
}
}
}
}
調(diào)用批處理腳本 a.bat
:
static void Main()
{
BatchScriptRunner.RunBatchScript(@"d:\a.bat");
}
示例 3: 執(zhí)行具有復(fù)雜輸出的命令
public class ComplexCommandExecutor
{
public static void ExecuteComplexCommand(string command)
{
ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd", $"/c {command}")
{
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
};
StringBuilder output = new StringBuilder();
StringBuilder error = new StringBuilder();
using (Process process = new Process())
{
process.StartInfo = processStartInfo;
process.OutputDataReceived += (sender, args) => output.AppendLine(args.Data);
process.ErrorDataReceived += (sender, args) => error.AppendLine(args.Data);
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
Console.WriteLine("Output:");
Console.WriteLine(output.ToString());
Console.WriteLine("Error:");
Console.WriteLine(error.ToString());
}
}
}
static void Main()
{
ComplexCommandExecutor.ExecuteComplexCommand("ipconfig /all");
}
結(jié)論
在C#中調(diào)用執(zhí)行命令行窗口可以非常靈活和強(qiáng)大,但也需要注意安全性和錯(cuò)誤處理。始終驗(yàn)證外部輸入,避免注入攻擊,并確保處理任何可能的異常和錯(cuò)誤輸出。正確使用時(shí),它可以是自動(dòng)化和系統(tǒng)集成的強(qiáng)大工具。
該文章在 2024/9/13 9:21:43 編輯過