【问题标题】:How to kill a process started by cmd.exe如何杀死由 cmd.exe 启动的进程
【发布时间】:2017-11-28 20:06:58
【问题描述】:

我正在尝试停止由 C# 中的 cmd.exe 启动的进程。例如用记事本启动; cmd.exe /c 记事本。

System.Diagnostics.ProcessStartInfo("cmd.exe", "/c notepad");

当我终止进程时,cmd.exe 停止。但记事本仍然存在。我怎样才能得到记事本的句柄并停止它?

【问题讨论】:

  • 您需要将notepad.exe 进程与cmd.exe 进程分开。如果您手动执行,这与您将看到的行为相同。

标签: c# process


【解决方案1】:

您应该使用自定义方法列出所有以 cmd 作为父进程的进程

您需要先添加 System.Management 引用。

然后简单地杀死进程树:

            void Main()
            {

                var psi = new ProcessStartInfo("cmd.exe", "/c notepad");
                var cmdProcess = Process.Start(psi);
                Thread.Sleep(2000);
                KillProcessAndChildren(cmdProcess.Id);

            }

            public void KillProcessAndChildren(int pid)
            {
            using (var searcher = new ManagementObjectSearcher
                ("Select * From Win32_Process Where ParentProcessID=" + pid))
            {
                var moc = searcher.Get();
                foreach (ManagementObject mo in moc)
                {
                    KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
                }
                try
                {
                    var proc = Process.GetProcessById(pid);
                    proc.Kill();
                }
                catch (Exception e)
                {
                    // Process already exited.
                }
            }
            }

【讨论】:

    【解决方案2】:

    您是否考虑过直接启动notepad.exe 而不是使用cmd.exe?

    【讨论】:

    • 我需要从命令行启动我的程序。记事本只是一个例子。
    【解决方案3】:

    你可以从命令行使用

    taskkill /MI cmd.exe /T

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多