Назад | Перейти на главную страницу

Как мне получить PID процесса conhost, связанного с пакетным файлом и процессом cmd, который его создал?

Скажем, у меня есть несколько Conhost процессы, которые уже запущены. Теперь я запускаю командный файл, который запускает cmd процесс, который, в свою очередь, вызывает другой Conhost процесс, чтобы открыться. Из командного файла

Моя цель - закрыть все остальные Conhost процессы, которые были запущены ранее (или, возможно, после запуска командного файла) и не закрывали Conhost связанный с самим пакетным файлом и cmd.exe делаю все закрытие. Если это Conhost закрывается, и его cmd процесс, и командный файл завершится преждевременно (я хочу, чтобы после этого он выполнял другие действия).

Это не дубликат вопроса, заданного по ссылке выше. Этот вопрос касался только получения pid из cmdне связанный Conhost PID.

Вы можете использовать инструмент Microsoft под названием Process Explorer, чтобы найти активные процессы. Вы можете найти процесс, перетащив целевой символ над окнами, для которых вы хотите получить PID.

Следующий фрагмент кода может привести к решению:

@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