How to Execute CLI Applications From C# and 返回执行中的输出信息,这里提供几种方法~

内容纲要

这位兄弟贴了段代码,目的是用Process类执行控制台命令并获执行该命令的输出信息,但执行失败了,代码这样的

 

  1. var psiNpm = new ProcessStartInfo
  2. {
  3. FileName = "cmd.exe",
  4. RedirectStandardOutput = true,
  5. RedirectStandardInput = true,
  6. UseShellExecute = false
  7. };
  8. var pNpmRun = Process.Start(psiNpm);
  9. pNpmRun.StandardInput.WriteLine("/c echo \"Fuck World\"");
  10. pNpmRun.StandardInput.WriteLine("echo \"Fuck World\"");
  11. var output = pNpmRun.StandardOutput.ReadToEnd();
  12. pNpmRun.StandardInput.WriteLine("exit");
  13. pNpmRun.WaitForExit();
  14. Console.WriteLine(output);

然后ChatGPT帮他解决了

  1. Process process = new Process();
  2. //process.StartInfo.FileName = "cmd.exe";
  3. process.StartInfo.FileName = "cmd";
  4. //process.StartInfo.Arguments = "/c echo \"Fuck World\"";
  5. process.StartInfo.Arguments = "/c echo Fuck World";
  6. //process.StartInfo.Arguments = "/c dotnet --list-sdks";
  7. process.StartInfo.UseShellExecute = false;
  8. process.StartInfo.RedirectStandardOutput = true;
  9. process.Start();
  10. process.WaitForExit();
  11. string output = process.StandardOutput.ReadToEnd();
  12. Console.WriteLine(output);

热心网友贴了段代码说是自己执行失败了,但贴主和我都能执行成功。

我对图中代码做了点修改,如下:

  1. var startInfo = new ProcessStartInfo()
  2. {
  3. FileName = "cmd",
  4. Arguments = "/c echo Hello World",
  5. UseShellExecute = false,
  6. RedirectStandardOutput = true
  7. };
  8. startInfo.Arguments = "/c dotnet --list-sdks";
  9. //if (!string.IsNullOrEmpty(dir))
  10. // startInfo.WorkingDirectory = dir;
  11. var p = new Process
  12. {
  13. StartInfo = startInfo,
  14. EnableRaisingEvents = true
  15. };
  16. var outputBuilder = new StringBuilder();
  17. p.OutputDataReceived += (sender, args) => outputBuilder.Append(args.Data+"\r\n");
  18. p.Start();
  19. p.BeginOutputReadLine();
  20. p.WaitForExit();
  21. p.CancelOutputRead();
  22. Console.WriteLine(outputBuilder.ToString());

其实贴主第一次放出来的代码调整下顺序也是能执行成功的,像这样:

  1. var psiNpm = new ProcessStartInfo
  2. {
  3. FileName = "cmd",
  4. RedirectStandardOutput = true,
  5. RedirectStandardInput = true,
  6. UseShellExecute = false
  7. };
  8. var pNpmRun = Process.Start(psiNpm);
  9. pNpmRun.StandardInput.WriteLine("echo \"Hello World\"");
  10. pNpmRun.StandardInput.WriteLine("exit");
  11. pNpmRun.WaitForExit();
  12. var output = pNpmRun.StandardOutput.ReadToEnd();
  13. Console.WriteLine(output);

等待执行结束pNpmRun.WaitForExit();

再去读取输出信息var output = pNpmRun.StandardOutput.ReadToEnd();

最后贴主给出了final solution

我复制粘贴执行了下,没问题~

  1. static void Main(string[] args)
  2. {
  3. Console.WriteLine("Hello, World!");
  4. Execute().Wait();
  5. }
  6. static async Task Execute()
  7. {
  8. var psi = new ProcessStartInfo()
  9. {
  10. FileName = "dotnet",
  11. Arguments = "--list-sdks"
  12. };
  13. using var proc=Process.Start(psi)!;
  14. await proc.WaitForExitAsync();
  15. }

以上是C#四种不同的方式使用Porcess执行命令后获取该命令的输出信息。

代码复制粘贴就能执行~

C#

快学会这个技能-.NET API拦截技法

2023-3-17 15:22:39

.Net CoreC#

什么是云LIS平台

2023-4-3 10:59:58

0 条回复 A文章作者 M管理员
欢迎您,新朋友,感谢参与互动!
    暂无讨论,说说你的看法吧
个人中心
今日签到
私信列表
搜索