private static Queue< string > _cmdQueue = new Queue< string > (); [MenuItem( " MyTools/ShowJavaVersion " , false )] static void ShowJavaVersion() AddCmd( " java -version " ); RunCmd(); public static void AddCmd( string cmd) _cmdQueue.Enqueue(cmd); public static void RunCmd() if (_cmdQueue.Count <= 0 ) Debug.Log( " finish " ); return ; using ( var process = new System.Diagnostics.Process()) process.StartInfo.FileName = " cmd.exe " ; process.StartInfo.UseShellExecute = false ; process.StartInfo.RedirectStandardInput = true ; process.StartInfo.RedirectStandardOutput = true ; process.StartInfo.RedirectStandardError = true ; process.StartInfo.WorkingDirectory = @" C:\ " ; // 不设置就是当前目录 process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal; process.StartInfo.CreateNoWindow = true ; // 不显示命令行的黑窗口 process.Start(); // 启动程序 var cmd = _cmdQueue.Dequeue(); // process.StandardInput.AutoFlush = true; // 下面手动Flush了, 所以这边可以注释掉 process.StandardInput.WriteLine(cmd); // 执行命令 process.StandardInput.WriteLine( " exit " ); // 执行完后自动退出cmd process.StandardInput.Flush(); // 或 process.StandardInput.Close(); process.WaitForExit(); // 等待程序执行完退出进程 if (process.HasExited) PrintAllLines(process.StandardOutput); PrintAllLines(process.StandardError); RunCmd(); private static void PrintAllLines(StreamReader sr) var gbkEnc = Encoding.GetEncoding( " gb2312 " ); // windows的命令行默认是gbk字符集的 using (StreamReader sr2 = new StreamReader(sr.BaseStream, gbkEnc)) // 换成gbk的Reader来读 while (! sr2.EndOfStream) string curLine = sr2.ReadLine(); if (! string .IsNullOrEmpty(curLine)) Debug.Log($ " {curLine} " ); #endif

执行ShowJavaVersion的运行结果:

1) 记事本打开c#代码文件

var process = new System.Diagnostics.Process();
process.StartInfo.FileName = "notepad.exe";
process.StartInfo.Arguments = "C:\\Users\\win\\Documents\\Test.cs";
process.Start();

2) 用资源管理器打开c#代码文件

System.Diagnostics.Process.Start("explorer.exe", "C:\\Users\\win\\Documents\\Test.cs");

运行后,出现了程序选择文件


3) 打开资源管理器

var processStartInfo = new System.Diagnostics.ProcessStartInfo();
processStartInfo.FileName = "explorer.exe"; //资源管理器
processStartInfo.Arguments = @"c:\";
System.Diagnostics.Process.Start(processStartInfo);


4) 用浏览器打开百度

var process = new System.Diagnostics.Process();
process.StartInfo.FileName = "360se.exe";
process.StartInfo.Arguments = "http://www.baidu.com";
process.Start();

这边没装360,报错了


5) 使用ImageMagick处理图片

var srcFile = "C:/Users/win/Documents/src.png";
var resultFile = "C:/Users/win/Documents/src-resize.png";
var cmd = $"magick convert -resize 300x600! {srcFile} {resultFile}";
CmdTool.AddCmd(cmd);
CmdTool.RunCmd();

处理后的图片

C#:为什么我的Process运行Java.exe工作正常,但窗口没有返回任何输出? - VoidCC

用户对问题“如何在C#中逐行读取命令输出结果”的回答 - 问答 - 腾讯云开发者社区-腾讯云 (tencent.com)

c#process的详细用法_新创美的博客-CSDN博客

C#/.NET 中启动进程时所使用的 UseShellExecute 设置为 true 和 false 分别代表什么意思?_walter lv的博客-CSDN博客_useshellexecute

ImageMagick 的安装及使用 - Rogn - 博客园 (cnblogs.com)