我以隐藏模式启动cmd文件(ftpCmdPath)。
System.Diagnostics.Process processCmd = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = ftpCmdPath;
processCmd.StartInfo = startInfo;
processCmd.Start();
之后我尝试用下一个逻辑停止它:
foreach (Process p in Process.GetProcessesByName("cmd"))
{
p.CloseMainWindow();
}
我也尝试过:
p.Kill();
p.Close();
当我以不同于Hidden的模式启动相同的cmd脚本时,一切正常,但隐藏进程始终保持工作。我看到调试器仍然调用了这个过程" cmd"但是当我试图关闭它时没有任何反应。
答案 0 :(得分:0)
您应该使用自定义方法列出将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.
}
}
}