You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}");
        }
    }
}

额外注意事项

  1. 确保redocly已全局安装且加入系统环境变量,否则需在WorkingDirectory中指定其安装路径(如npm全局安装路径C:\Users\用户名\AppData\Roaming\npm)。
  2. 读取流时必须先执行ReadToEnd()再调用WaitForExit(),否则可能因输出缓冲区填满导致进程死锁。
  3. 始终检查错误输出流,即使进程退出码为0,也可能存在警告信息。

内容的提问来源于stack exchange,提问作者USMC6072

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:40:05