process.start() 静默失败是设计行为,需验证路径、检查返回值、显式设参数;优先用绝对路径,filename仅放路径,arguments或argumentlist传参;useshellexecute=false才能重定向和获取exitcode。

Process.Start() 静默失败不是异常,是设计行为——它不报错、不抛异常、甚至返回 null,你得自己验证路径、检查返回值、显式设参数。
Process.Start() 为什么没反应?
最常见原因是 Windows 根本没找到可执行文件:它只在 PATH 环境变量里搜,而 Process.Start("ffmpeg.exe") 这种写法一旦不在 PATH 中,就直接跳过,连日志都不留。
- 永远优先用绝对路径:
Process.Start(@"C:\Tools\ffmpeg.exe"),别依赖当前工作目录 - 若必须用相对路径,必须显式设置
WorkingDirectory:startInfo.WorkingDirectory = @"C:\MyApp\bin" - 检查返回值:
var proc = Process.Start(startInfo); if (proc == null) throw new InvalidOperationException("进程启动失败"); - 不要用
Assembly.Location或AppContext.BaseDirectory拼路径——单文件发布后它们指向临时目录,每次都不一样
FileName 和 Arguments 怎么分才不崩?
把路径和参数混在同一个字符串里(比如 Process.Start("C:\Program Files\tool.exe -i file.txt"))是绝大多数“参数错乱”“空格截断”“命令注入”的根源。
-
FileName只放可执行文件路径(支持绝对或相对),含空格也不用手动加引号:FileName = @"C:\Program Files\7-Zip\7z.exe" - 所有参数统一塞进
Arguments字符串:Arguments = @"a -x ""D:\My File.zip"" -o""E:\Out""",.NET 内部会自动转义 - .NET 5+ 推荐用
ArgumentList(IList<string></string>):ArgumentList = { "-i", @"C:\video with space.mp4", "-c:v", "libx264" },彻底规避引号拼接问题 - 绝对不要手动拼接引号或用字符串插值构造
Arguments,比如Arguments = $"-i \"{filePath}\""—— 这仍可能被绕过
UseShellExecute = false 是重定向和 ExitCode 的硬开关
默认 UseShellExecute = true,此时你调 proc.StandardOutput.ReadToEnd() 会直接抛 InvalidOperationException:“此进程未被配置为重定向标准输出”。这不是编码问题,是开关没关对。
- 要读输出、捕获错误、获取
ExitCode,必须设UseShellExecute = false - 同时启用重定向:
RedirectStandardOutput = true、RedirectStandardError = true - 注意:设了
RedirectStandardOutput却不读,子进程可能因管道缓冲区满而卡死;务必在WaitForExit()前或后读完,或用BeginOutputReadLine() - 如果目标程序输出中文,
StandardOutput默认用 UTF-8 读可能乱码,可改用Encoding.Default
WaitForExit() 卡住或读不到 ExitCode 怎么办?
WaitForExit() 不带参数就是无限等待,而 GUI 程序(如 notepad.exe)不会自动退出,主线程就永远挂起。
- 永远加超时:
if (!proc.WaitForExit(30000)) { proc.Kill(); proc.WaitForExit(); } -
ExitCode必须在WaitForExit()返回true后读,之前读是未定义值(常为 0) - 用
Exited事件异步监控时,记得先设EnableRaisingEvents = true,并在回调里检查proc.HasExited,避免访问已释放对象 - 别在
using块里提前释放Process对象,否则事件回调中访问proc.ExitCode会出错
真正麻烦的从来不是语法,而是路径解析依赖环境、参数传递受 Windows 命令行解析器约束、重定向与等待顺序稍有错位就会死锁——这些边界条件不亲手踩几回坑,文档根本记不住。











