命名空間: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() |
| 取得子進程 ID | proc.Id |
常見錯誤
UseShellExecute = true(預設)時設定 RedirectStandardOutput → 例外
- 未讀取
StandardOutput/StandardError 導致管道塞滿、子進程卡死
- 未呼叫
WaitForExit() 就結束父進程,導致子進程成為孤兒