using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HttpClientStudy.Core.Utilities { /// <summary> /// dotnet命令行工具类 /// </summary> public static class DotnetCommondUtility { /// <summary> /// 执行dotnet命令 /// </summary> /// <param name="command">命令</param> /// <param name="argument">命令参数</param> /// <param name="newWindow">新窗口执行命令</param> /// <returns>命令行输出文本</returns> public static string ExecuteCommand(string command, string argument = "", bool newWindow = false) { string output = ""; try { if (newWindow) { ProcessStartInfo startInfo = new ProcessStartInfo() { FileName = "pwsh.exe", Arguments = $" Start-Process -FilePath 'dotnet' {command} {argument}", //RedirectStandardOutput = true, //StandardOutputEncoding = Encoding.UTF8, //RedirectStandardError = true, //StandardErrorEncoding = Encoding.UTF8, //RedirectStandardInput = false, //StandardInputEncoding = Encoding.UTF8, UseShellExecute = false, CreateNoWindow = false, }; Process process = new Process() { StartInfo = startInfo, }; process.Start(); output = "命令已在新窗口执行!"; } else { ProcessStartInfo startInfo = new ProcessStartInfo() { FileName = "dotnet", Arguments = $"{command} {argument}", RedirectStandardOutput = true, StandardOutputEncoding = Encoding.UTF8, RedirectStandardError = true, StandardErrorEncoding = Encoding.UTF8, //RedirectStandardInput = false, //StandardInputEncoding = Encoding.UTF8, //启用内核模式时,不能重定向输出 UseShellExecute = false, //不创建新窗口 CreateNoWindow = false, }; Process process = new Process() { StartInfo = startInfo, }; //处理输出 process.OutputDataReceived += (sender, args) => { if (!string.IsNullOrEmpty(args.Data)) { output += args.Data; } }; process.Start(); //开始异步读取输出 process.BeginOutputReadLine(); //等待里程结束 process.WaitForExit(); } } catch (Exception ex) { output = $"An error occurred: {ex.Message}"; } return output; } /// <summary> /// 新窗口启动WebApp项目 /// </summary> /// <param name="startFile">包含全路径的WebApp项目</param> /// <param name="args">命令参数</param> /// <returns></returns> public static string RunWebApp(string startFile, params string[] args) { string output = ""; try { ProcessStartInfo startInfo = new ProcessStartInfo() { FileName = "powershell.exe", Arguments = $"Start-Process -FilePath '{startFile}' -ArgumentList '{string.Join(" ", args)}' ", UseShellExecute = true, CreateNoWindow = false, }; Process process = new Process() { StartInfo = startInfo, }; process.Start(); output = "已在新窗口中启动WebApp项目。如果已有实例在运行或者执行异常,则窗口会自动关闭;否则新窗口一直存在,直到手动关闭!"; } catch (Exception ex) { output = $"An error occurred: {ex.Message}"; } return output; } /// <summary> /// 停止WebAPI项目 /// </summary> /// <param name="startFile">包含全路径的可执行文件</param> /// <returns></returns> public static string SopWebApp() { string output = ""; try { string projectAndMutexName = WebApiConfigManager.GetWebApiConfigOption().CurrentValue.WebAppMutexName; ProcessStartInfo startInfo = new ProcessStartInfo() { FileName = "powershell.exe", Arguments = $"Stop-Process -Name '{projectAndMutexName}'", UseShellExecute = false, CreateNoWindow = true, RedirectStandardOutput = true, StandardOutputEncoding = Encoding.UTF8, }; Process process = new Process() { StartInfo = startInfo, }; process.Start(); process.WaitForExit(); output = process.StandardOutput.ReadToEnd(); } catch (Exception ex) { output = $"An error occurred: {ex.Message}"; } return output; } } }