在当前CMD窗口中找到conhost.exe进程的PID。

时间:2018-10-28 21:13:42

标签: windows batch-file cmd pid

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

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

因此,我决定创建一个“关闭”命令,该命令将始终关闭当前窗口,而不管其内部运行了什么。我选择了窗口检测的PID方法(以避免出现标题相同的窗口),然后将taskkill与/ F和/ T开关配合使用以终止进程。它工作正常,但与使用标准“退出”命令存在相同的问题。

我运行tasklist并意识到 current CMD窗口的PID每次在其中运行cmd.exe时都会改变(您甚至可以看到列出的cmd.exe的多个实例。尽管没有打开任何新窗口),所以使用cmd.exe PID并非可用的方法。但是,每个窗口确实有其关联的 conhost.exe 进程(与cmd实例的数量无关),因此杀死comhost进程似乎是实现我想要的最好的方法。

我手动尝试过,它完全可以按照我的要求工作。

  1. 打开一个cmd控制台窗口,然后在该窗口中运行cmd.exe几次。
  2. 打开第二个cmd控制台窗口,在第二个窗口中运行几次cmd.exe。
  3. 使用任务列表为您找到的窗口查找 conhost 进程的PID 要关闭。
  4. 手动运行:taskkill / PID << em>宿主进程的PID > / F杀死 选定的主持人。

以上内容会立即关闭指定的控制台窗口(及其所有相关的cmd.exe实例),同时不理会其他控制台窗口。

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

这是this code,我正在用它来进行当前的cmd PID检测(我在网上找到了)。我不明白(我是代码新手),但是效果很好。

然后,我根据当前窗口的退出cmd.exe PID寻找了确定主机PID的方法,但是除了this之外,我什么都找不到,它没有用(并且也导致了批处理文件中与现有命令无关的其他各种问题。

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

set T=%TEMP%\sthUnique.tmp
wmic process where (Name="WMIC.exe" AND CommandLine LIKE "%%%TIME%%%") get ParentProcessId /value | find "ParentProcessId" >%T%
set /P A=<%T%
set PID=%A:~16%

0 个答案:

没有答案