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

C# 啟動外部進程的三種常見模式:Process.Start 完整指南

     編輯:關於C#

命名空間:System.Diagnostics

模式一:啟動並忘記


// 最簡單:啟動預設關聯程式開啟檔案/網址
Process.Start("calc.exe");
Process.Start("notepad.exe", @"C:\test.txt");
Process.Start("https://docs.microsoft.com"); // 使用預設瀏覽器

模式二:啟動、等待結束、取得輸出


var psi = new ProcessStartInfo
{
    FileName = @"C:\scripts\listfiles.bat",
    RedirectStandardOutput = true,
    RedirectStandardError = true,
    UseShellExecute = false,        // 必須 false 才能重導向
    CreateNoWindow = true,          // 不顯示黑框
    StandardOutputEncoding = Encoding.UTF8,
    StandardErrorEncoding = Encoding.UTF8
};

using (var proc = Process.Start(psi))
{
    string output = proc.StandardOutput.ReadToEnd();
    string error = proc.StandardError.ReadToEnd();
    bool exited = proc.WaitForExit(5000); // 最多等 5 秒
    if (!exited) proc.Kill();

    Console.WriteLine($"ExitCode: {proc.ExitCode}");
    Console.WriteLine($"Output:\n{output}");
    if (!string.IsNullOrEmpty(error)) Console.Error.WriteLine(error);
}

模式三:啟動進程並傳遞輸入(互動式)


var psi = new ProcessStartInfo
{
    FileName = "python.exe",
    Arguments = "-c \"import sys; print(sys.stdin.read().upper())\"",
    RedirectStandardInput = true,
    RedirectStandardOutput = true,
    UseShellExecute = false,
    CreateNoWindow = true
};

using (var proc = Process.Start(psi))
{
    proc.StandardInput.WriteLine("hello world");
    proc.StandardInput.Close(); // 關閉 stdin 讓子進程知道輸入結束
    string result = proc.StandardOutput.ReadToEnd();
    proc.WaitForExit();
    Console.WriteLine(result.Trim()); // HELLO WORLD
}

進階技巧

需求做法
以系統管理員權限執行psi.Verb = "runas";(會彈出 UAC)
設定工作目錄psi.WorkingDirectory = @"C:\MyApp";
環境變數psi.EnvironmentVariables["MY_VAR"] = "value";
非同步事件式讀取訂閱 proc.OutputDataReceived/ErrorDataReceived,呼叫 proc.BeginOutputReadLine()
取得子進程 IDproc.Id

常見錯誤

  • UseShellExecute = true(預設)時設定 RedirectStandardOutput → 例外
  • 未讀取 StandardOutput/StandardError 導致管道塞滿、子進程卡死
  • 未呼叫 WaitForExit() 就結束父進程,導致子進程成為孤兒
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved