查找当前CMD窗口的conhost.exe进程的PID

Pem*_*hoo 6 windows cmd pid batch-file

我想创建一个 doskey 命令来关闭当前的CMD 控制台窗口,而不影响任何其他打开的 CMD 控制台窗口。

\n\n

即使 cmd.exe 已在该窗口中运行(手动或通过批处理文件),它也必须正常工作。通常我只会使用该exit命令,但如果该窗口中运行了 cmd.exe 的其他实例,则这不会关闭窗口。

\n\n

因此,我决定创建一个“关闭”命令,该命令始终关闭当前窗口,无论其中运行了什么。我选择了窗口检测的PID方法(以避免具有相同标题的窗口的问题),然后taskkill与/F和/T开关一起使用来终止进程。它工作得很好,但它与使用标准“exit”命令有同样的问题。

\n\n

我运行并意识到,只要在其中运行 cmd.exe,当前tasklistCMD 窗口的 PID就会发生变化(即使没有打开新窗口,您也可以看到列出的 cmd.exe 的多个实例),因此使用 cmd.exe PID 是不是一个可用的方法。但是,每个窗口都有自己的conhost.exe进程与之关联(无论 cmd 实例的数量如何),因此终止 comhost 进程似乎是实现我想要的效果的最佳方法。

\n\n

我手动尝试了一下,效果完全符合我的要求。

\n\n
    \n
  1. 打开一个 cmd 控制台窗口,然后在该窗口中运行 cmd.exe 几次。
  2. \n
  3. 打开第二个 cmd 控制台窗口,在第二个窗口中运行 cmd.exe 几次。
  4. \n
  5. 使用任务列表查找您要关闭的窗口的conhost进程的 PID。\n
  6. \n
  7. 手动运行: \xe2\x80\x82\xe2\x80\x82 taskkill /PID <并发主机进程的 PID > /F \xe2\x80\x82\xe2\x80\x82 以终止所选的并发主机。
  8. \n
\n\n

上述命令立即关闭指定的控制台窗口(及其所有相关的 cmd.exe 实例),同时保留其他控制台窗口。

\n\n

因此,我只需要在批处理文件中复制上述过程,以便我可以使用 doskey 命令来调用它,而不是现有的 cmd PID 检查代码。

\n\n

这是我用于当前 cmd PID 检测的代码(我在网上找到的)。我不明白它(我是代码新手),但它工作得很好。

\n\n

然后,我寻找根据当前窗口的现有 cmd.exe PID 来确定 conhost PID 的方法,但除此之外我找不到任何东西,不起作用(并且还导致了与现有的不相关的各种其他问题)我的批处理文件中的命令)。

\n\n

也许有一种更简单的方法可以实现我的目标,但如果杀死 conhost 是可行的方法,那么在我看来,下面代码的修改版本(使其找到当前 conhost PID 而不是当前 cmd PID)这就是答案,因为在批处理文件中只需很少的代码行即可可靠地工作。

\n\n
set T=%TEMP%\\sthUnique.tmp\nwmic process where (Name="WMIC.exe" AND CommandLine LIKE "%%%TIME%%%") get ParentProcessId /value | find "ParentProcessId" >%T%\nset /P A=<%T%\nset PID=%A:~16%\n
Run Code Online (Sandbox Code Playgroud)\n