基于C#构建Angular项目生成器的cmd命令执行问题求助
问题排查与解决方案
一、当前代码的核心问题
- cmd启动方式错误:直接启动
cmd.exe会进入交互式终端,后续通过StandardInput写入的命令可能无法被正确触发执行。需要通过/c参数让cmd执行完指定命令后自动退出。 - 冗余的cd命令:已经通过
process.StartInfo.WorkingDirectory设置了工作目录,无需再执行cd命令;如果路径包含空格,未加引号的cd命令会直接失败。 - 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
相关产品推荐
相关产品推荐

