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

基于C#构建Angular项目生成器的cmd命令执行问题求助

问题排查与解决方案

一、当前代码的核心问题

  1. cmd启动方式错误:直接启动cmd.exe会进入交互式终端,后续通过StandardInput写入的命令可能无法被正确触发执行。需要通过/c参数让cmd执行完指定命令后自动退出。
  2. 冗余的cd命令:已经通过process.StartInfo.WorkingDirectory设置了工作目录,无需再执行cd命令;如果路径包含空格,未加引号的cd命令会直接失败。
  3. WaitForInputIdle无效:WaitForInputIdle仅适用于GUI程序,对控制台程序(如cmd)不起作用,反而可能导致不必要的延迟。

二、修正后的代码示例

using (Process process = new Process())
{
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardError = true;
    process.StartInfo.WorkingDirectory = Properties.Settings.Default.location;
    // 用/c参数让cmd执行命令后退出,直接拼接ng new的完整非交互式命令
    string ngCommand = $"ng new {projectName} --routing={AngularRouting} --style=css --skip-git";
    process.StartInfo.FileName = Path.Combine(Environment.SystemDirectory, "cmd.exe");
    process.StartInfo.Arguments = $"/c \"{ngCommand}\"";
    
    process.OutputDataReceived += ProcessOutputDataHandler;
    process.ErrorDataReceived += ProcessErrorDataHandler;
    
    process.Start();
    process.BeginOutputReadLine();
    process.BeginErrorReadLine();
    
    process.WaitForExit();
}

三、处理Angular项目创建的交互问题

Angular CLI提供了非交互式参数,可以直接在命令行中指定所有选项,完全避免手动输入交互,这也是最稳定的方式:

  • --routing=true/false:直接指定是否启用路由,替代手动输入y/n
  • --style=css/scss/sass/less:指定样式文件格式,替代选择序号
  • --skip-git:跳过初始化Git仓库(如果不需要)
  • --skip-install:跳过依赖安装(如需后续手动处理)
  • --defaults:直接使用所有默认选项,无需任何交互

如果必须处理交互式输入(不推荐),需注意:

  • 要等待ng命令输出交互提示后,再通过StandardInput写入响应
  • 每个响应后要调用WriteLine()模拟回车键
  • 但这种方式不稳定,不同Angular版本的交互提示可能有变化,优先用非交互式参数

四、额外注意事项

  • 确保Angular CLI已全局安装,且ng命令能在cmd中正常执行(可先手动测试ng --version)
  • 如果路径包含空格,所有涉及路径的参数都要用双引号包裹
  • 可通过process.ExitCode判断命令执行结果(0为成功,非0为失败)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 01:24:13