C#调用Cmd执行redocly split无响应,求排查解决
解决C#执行redocly split命令无响应的问题
问题根源分析
你的代码存在几个关键问题,导致命令执行无反馈:
- CMD参数格式错误:调用
cmd.exe必须加上/c参数来指定要执行的命令,否则CMD仅启动终端但不执行后续指令。 - 流读取逻辑错误:第一次调用
ReadToEnd()会耗尽输出流,第二次调用时流已为空,无法获取真实的输出或错误信息。 - 参数格式错误:
--outDir= "../bin/swagger"中等号后的空格会被解析为路径的一部分,导致目标目录无效。 - 工作目录不匹配风险:
Directory.GetCurrentDirectory()返回的程序当前目录可能不是redocly命令所在的目录,导致无法找到该命令。
修复后的代码
public static void RunSplitCommand() { string output = string.Empty; string error = string.Empty; // 修正命令参数,去掉outDir后的空格 var redoclyCommand = "redocly split \"../bin/swagger/Swagger.json\" --outDir=\"../bin/swagger\""; // 给CMD添加/c参数,指定要执行的命令 var args = $"/c {redoclyCommand}"; using (var process = new System.Diagnostics.Process()) { process.StartInfo = new System.Diagnostics.ProcessStartInfo(); // 可选:指定redocly所在目录(若未加入系统环境变量) // process.StartInfo.WorkingDirectory = @"C:\Users\你的用户名\AppData\Roaming\npm"; process.StartInfo.FileName = "cmd.exe"; process.StartInfo.Arguments = args; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; process.StartInfo.CreateNoWindow = true; // 隐藏CMD窗口 try { process.Start(); // 先读取所有输出和错误,再等待进程退出,避免缓冲区满导致死锁 output = process.StandardOutput.ReadToEnd(); error = process.StandardError.ReadToEnd(); process.WaitForExit(); // 合并输出与错误信息 if (!string.IsNullOrEmpty(error)) output = $"{output}\n错误详情:{error}"; Console.WriteLine(output); } catch (Exception ex) { Console.WriteLine($"执行失败:{ex.Message}"); } } }
额外注意事项
- 确保
redocly已全局安装且加入系统环境变量,否则需在WorkingDirectory中指定其安装路径(如npm全局安装路径C:\Users\用户名\AppData\Roaming\npm)。 - 读取流时必须先执行
ReadToEnd()再调用WaitForExit(),否则可能因输出缓冲区填满导致进程死锁。 - 始终检查错误输出流,即使进程退出码为0,也可能存在警告信息。
内容的提问来源于stack exchange,提问作者USMC6072
相关产品推荐
相关产品推荐

