Найти PID процесса conhost.exe для текущего окна CMD - PullRequest
0 голосов
/ 29 октября 2018

Я хочу создать команду doskey, которая закрывает текущее консольное окно CMD , не затрагивая другие открытые консольные окна CMD.

Он должен работать, даже если cmd.exe был запущен (вручную или с помощью пакетного файла) в этом окне. Обычно я просто использовал бы команду exit, но это не закрывало бы окно, если в этом окне были запущены другие экземпляры cmd.exe.

Поэтому я решил создать команду «Закрыть», которая всегда будет закрывать текущее окно независимо от того, что было запущено внутри него. Я выбрал PID-метод определения окна (чтобы избежать проблем с окнами с одинаковыми заголовками), а затем использовал taskkill с ключами / F и / T, чтобы завершить процесс. Он работал нормально, но у него была та же проблема, что и при использовании стандартной команды exit.

Я запустил tasklist и понял, что PID окна current CMD меняется всякий раз, когда внутри него запускается cmd.exe (вы можете увидеть несколько экземпляров cmd.exe в списке, даже если нет новых окно было открыто), поэтому использование cmd.exe PID не подходит для использования. Однако каждое окно имеет свой собственный процесс conhost.exe , связанный с ним (независимо от количества экземпляров cmd), поэтому уничтожение процесса comhost представляется наилучшим способом достижения того, чего я хочу.

Я попробовал это вручную, и оно работает именно так, как я хотел.

  1. Откройте одно окно консоли cmd, затем несколько раз запустите cmd.exe в этом окне.
  2. Откройте второе окно консоли cmd, несколько раз запустите cmd.exe во втором окне.
  3. Используйте список задач, чтобы найти PID процесса conhost для окна, которое вы хочу закрыть.
  4. Запустить вручную: taskkill / PID <<em> PID процесса conhost > / F, чтобы убить выбранный призрак.

Вышеуказанное немедленно закрывает указанное окно консоли (и все связанные с ним экземпляры cmd.exe), оставляя другое окно консоли в покое.

Поэтому мне просто нужно скопировать описанный выше процесс в командный файл, чтобы я мог использовать команду doskey для вызова этого вместо существующего кода проверки cmd PID.

Это этот код , который я использую для текущего обнаружения PID cmd (который я нашел в Интернете). Я не понимаю этого (я новичок в коде), но он отлично работает.

Затем я искал способ определения PID conhost на основе выходящего PID cmd.exe текущего окна, но я не смог найти ничего, кроме this , который не работал (и который также вызывал различные другие проблемы с несвязанными существующими командами в моем командном файле).

Может быть, есть гораздо более простой способ достижения моей цели, но если нужно убить conhost, то мне кажется, что модифицированная версия кода ниже (чтобы он нашел текущий PID conhost вместо текущего 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%
...