Process.Start没反应最常见原因是路径错误或工作目录未设置;需用绝对路径、设WorkingDirectory、UseShellExecute=false才能重定向输出并获取退出码。

Process.Start 为什么没反应?
最常见的情况是路径写错了,或者没处理工作目录。C# 的 Process.Start 默认不抛异常,即使 exe 根本不存在、参数错得离谱,它也可能静默失败。
- 用绝对路径启动,避免相对路径依赖当前工作目录 —— 比如
"C:\Tools\mytool.exe"而不是"mytool.exe" - 显式设置
StartInfo.WorkingDirectory,尤其当目标程序依赖同目录下的配置或 DLL 时 - 务必检查
StartInfo.UseShellExecute = false:设为true(默认)时无法重定向输出、无法获取退出码;设为false才能读StandardOutput和ExitCode
怎么拿到外部程序的输出和错误?
必须关掉外壳执行,并手动启用重定向。否则 StandardOutput 是 null,读取会直接报 InvalidOperationException。
-
StartInfo.UseShellExecute = false是前提 - 设置
StartInfo.RedirectStandardOutput = true和/或RedirectStandardError = true - 调用
process.WaitForExit()后再读process.StandardOutput.ReadToEnd(),不能边跑边读(除非用事件或异步读取) - 注意编码:如果外部程序输出中文,而你用默认
Encoding.UTF8读,可能乱码 —— 可改用Encoding.Default(即系统 ANSI 编码)
传参带空格或特殊字符怎么办?
别拼字符串。Windows 命令行解析规则复杂,手动加引号极易出错,比如 "C:Program Files ool.exe" -i "a b.txt" 这种组合,用字符串拼接很容易漏引号或引号嵌套错。
- 把可执行路径单独传给
StartInfo.FileName - 把所有参数(包括带空格的路径、含空格的值)作为单个字符串传给
StartInfo.Arguments,让 .NET 内部处理转义 - 示例:
process.StartInfo.FileName = @"C:My App unner.exe"; process.StartInfo.Arguments = @"-config ""D:My Configsdev settings.json"" -verbose";
WaitForExit 一直卡住?
本质是子进程没退出,或者 stdout/stderr 缓冲区满了导致死锁 —— 尤其在同时重定向输出又没及时读取时。
- 永远不要只等不读:如果开了
RedirectStandardOutput,必须在WaitForExit()前或后读完,否则子进程可能因管道满而阻塞 - 加超时更安全:
process.WaitForExit(10000),返回false表示超时,这时可考虑Kill() - 注意 GUI 程序:比如启动
notepad.exe,它不会自动退出,WaitForExit()会永远挂起,除非用户手动关掉窗口
实际用的时候,最麻烦的是输出编码和死锁组合问题 —— 看似启动成功,但读不到内容,也不报错,最后发现是子进程 stdout 满了卡住,而你还在等它退出。










