![如何获取与创建该批处理文件和 cmd 进程关联的 conhost 进程的 PID?](https://linux22.com/image/714215/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E4%B8%8E%E5%88%9B%E5%BB%BA%E8%AF%A5%E6%89%B9%E5%A4%84%E7%90%86%E6%96%87%E4%BB%B6%E5%92%8C%20cmd%20%E8%BF%9B%E7%A8%8B%E5%85%B3%E8%81%94%E7%9A%84%20conhost%20%E8%BF%9B%E7%A8%8B%E7%9A%84%20PID%EF%BC%9F.png)
说我有几个康索进程恰好已经在运行。现在我运行一个批处理文件,它启动一个cmd
进程,而这个进程又会导致另一个进程康索要打开的进程。在批处理文件中
- 我知道我可以获取该批处理文件的 cmd 进程的 PID, 但
- 我不知道该怎么做获取
PID
关联的康索过程。
我的目标是能够关闭所有其他康索先前运行的进程(或者可能是在运行批处理文件之后)并且没有关闭康索与该批处理文件相关联并cmd.exe
执行所有关闭操作。如果康索被关闭,它的cmd
进程和批处理文件也会过早结束(我希望它在那之后做其他事情)。
这不是上面链接中提出的问题的重复。那个问题只涉及获取的pid
,cmd
而不是相关康索 PID
。
答案1
以下代码片段可以找到解决方案:
@ECHO OFF
SETLOCAL EnableExtensions
::: get my own process ID - use any method
::: applied here: altered TonyRoth's answer https://serverfault.com/a/126643/257436
set "_title=a885974x%random%"
title %_title%
for /f "tokens=2" %%G in ('tasklist /V ^| findstr "%_title%"') do (
set "_myProcessID=%%~G"
)
::: get the associated conhost process ID
set "_wQuery=ParentProcessId=%_myProcessID% and Name='conhost.exe'"
::: debug ::: wmic process where "%_wQuery%" get Name, ProcessId, WindowsVersion
for /f "usebackq" %%G in (`
wmic process where "%_wQuery%" get ProcessId^, WindowsVersion^|findstr /R "[0-9]"
`) do set "_myConhostID=%%~G"
::: propagate results
set _my