首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# Process 類別實戰:啟動外部程式與執行命令列指令

     編輯:關於C語言

核心概念

System.Diagnostics.Process 類別提供啟動、控制、監控作業系統進程的功能。透過啟動 cmd.exe 並傳遞參數,即可在 C# 中執行任意命令列指令並捕獲輸出。

關鍵屬性設定

屬性用途典型值
FileName要啟動的執行檔"cmd.exe"
Arguments命令列參數"/c dir"(執行完畢關閉視窗)
UseShellExecute是否使用 Shell 執行false(必須為 false 才能重導向 I/O)
RedirectStandardInput重導向標準輸入true
RedirectStandardOutput重導向標準輸出true
RedirectStandardError重導向標準錯誤true
CreateNoWindow不建立視窗true(背景執行)

完整封裝範例:執行命令並取得輸出

using System.Diagnostics;

public static string RunCommand(string command, int timeoutMs = 30000)
{
    var startInfo = new ProcessStartInfo
    {
        FileName = "cmd.exe",
        Arguments = $"/c {command}",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        CreateNoWindow = true,
        StandardOutputEncoding = System.Text.Encoding.UTF8, // 避免中文亂碼
        StandardErrorEncoding = System.Text.Encoding.UTF8
    };

    using (var process = Process.Start(startInfo))
    {
        if (process == null) throw new InvalidOperationException("無法啟動進程");

        string output = process.StandardOutput.ReadToEnd();
        string error = process.StandardError.ReadToEnd();

        bool exited = process.WaitForExit(timeoutMs);
        if (!exited)
        {
            process.Kill();
            throw new TimeoutException($"命令執行超時 ({timeoutMs} ms)");
        }

        if (process.ExitCode != 0 && !string.IsNullOrEmpty(error))
            throw new InvalidOperationException($"命令失敗 (ExitCode={process.ExitCode}): {error}");

        return output.Trim();
    }
}

進階用法

互動式模式(保持 cmd 開啟)

Arguments = "/k"; // 執行後保持視窗,適合除錯
// 透過 StandardInput.WriteLine() 送入多行指令
process.StandardInput.WriteLine("cd C:\\Projects");
process.StandardInput.WriteLine("dotnet build");
process.StandardInput.WriteLine("exit"); // 必須送入 exit 結束

非同步事件式讀取(避免大量輸出死結)

process.OutputDataReceived += (s, e) => { if (e.Data != null) Console.WriteLine(e.Data); };
process.ErrorDataReceived += (s, e) => { if (e.Data != null) Console.Error.WriteLine(e.Data); };
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();

以系統管理員權限執行

startInfo.Verb = "runas"; // 需 UAC 提權

常見坑點與解決

  • 中文亂碼: 設定 StandardOutputEncoding / StandardErrorEncoding 為 Encoding.UTF8 或 Encoding.GetEncoding(950)(繁體中文預設代碼頁)。
  • 死結: 同步讀取 ReadToEnd() 時若輸出超過緩衝區會卡住,大量輸出請用非同步事件式讀取。
  • 路徑含空白: 參數以雙引號包裹:Arguments = $\"/c \\\"{path}\\\" {args}\"。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved