ProcessHelper.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. using System.Diagnostics;
  2. using System.Text;
  3. using System.Text.Json;
  4. namespace IES.ExamServer.Helpers
  5. {
  6. public class ProcessHelper
  7. {
  8. public static (int code, string msg) ExecuteProcess( string pathBat )
  9. {
  10. int code = 0;
  11. string msg = string.Empty;
  12. try {
  13. // 创建一个新的 ProcessStartInfo 对象
  14. ProcessStartInfo startInfo = new ProcessStartInfo
  15. {
  16. // 指定要执行的 BAT 文件的路径
  17. FileName = "cmd.exe",
  18. // 设置命令行参数,使用 /c 表示执行命令后关闭命令提示符窗口
  19. Arguments = $"/c \"{pathBat}\"", // 用双引号括起路径
  20. // 设置是否使用操作系统 shell 启动进程
  21. UseShellExecute = false,
  22. // 设置是否创建新的窗口
  23. CreateNoWindow = true,
  24. // 重定向标准输出和标准错误输出
  25. RedirectStandardOutput = true,
  26. RedirectStandardError = true
  27. };
  28. // 创建一个新的 Process 对象
  29. using (Process process = new Process())
  30. {
  31. // 将 ProcessStartInfo 对象分配给 Process 对象
  32. process.StartInfo = startInfo;
  33. process.StartInfo.StandardOutputEncoding = Encoding.UTF8;
  34. process.StartInfo.StandardErrorEncoding = Encoding.UTF8;
  35. // 启动进程
  36. process.Start();
  37. // 读取标准输出和标准错误输出
  38. string output = process.StandardOutput.ReadToEnd();
  39. string error = process.StandardError.ReadToEnd();
  40. // 等待进程执行完成
  41. process.WaitForExit();
  42. // 输出执行结果
  43. if (!string.IsNullOrEmpty(output))
  44. {
  45. // Console.WriteLine("标准输出:");
  46. // Console.WriteLine(output);
  47. if (output.Contains("successfully", StringComparison.OrdinalIgnoreCase))
  48. {
  49. msg = $"执行成功!";
  50. code = 200;
  51. }
  52. else
  53. {
  54. msg = $"执行异常:{output}";
  55. code = 1;
  56. }
  57. }
  58. if (!string.IsNullOrEmpty(error))
  59. {
  60. // Console.WriteLine("错误输出:");
  61. // Console.WriteLine(error);
  62. msg = $"执行失败:{error}";
  63. code = 2;
  64. }
  65. }
  66. } catch (Exception ex) {
  67. code = 500;
  68. msg = $"{ex.Message},{ex.StackTrace}";
  69. }
  70. return (code, msg);
  71. }
  72. /// <summary>
  73. /// 获取所有名为 "conhost.exe" 的进程
  74. /// </summary>
  75. public static void CloseConhost()
  76. {
  77. Process[] conhostProcesses = Process.GetProcessesByName("conhost");
  78. var CurrentProcess = Process.GetCurrentProcess();
  79. var stime = CurrentProcess.StartTime;
  80. if (conhostProcesses.Length == 0)
  81. {
  82. //Console.WriteLine("没有找到 conhost.exe 进程。");
  83. return;
  84. }
  85. // 遍历并关闭每个 conhost.exe 进程
  86. foreach (Process process in conhostProcesses)
  87. {
  88. TimeSpan difference = stime- process.StartTime ;
  89. if (CurrentProcess.ProcessName.Equals(process.ProcessName))
  90. {
  91. if (difference.Seconds>10)
  92. {
  93. continue;
  94. }
  95. try
  96. {
  97. // 关闭进程
  98. process.Kill();
  99. //Console.WriteLine($"已关闭进程 ID: {process.Id},{process.MachineName},{process.ProcessName}");
  100. }
  101. catch (Exception ex)
  102. {
  103. //Console.WriteLine($"无法关闭进程 ID: {process.Id}, 错误: {ex.Message}");
  104. }
  105. }
  106. }
  107. //Console.WriteLine("操作完成。");
  108. }
  109. }
  110. }