Windows: найшвидший спосіб вбити процес, запущений на певному порту


11

Я багато разів переживаю цей процес. Мені потрібно вбити процес на машині Windows, і я просто знаю його порт. Зазвичай кроки виконуються нижче: Знайдіть PID, переглянувши порти (наприклад, порт 8084) Перерахуйте процеси, що працюють на портах

netstat -a -o -n

А потім вбити процес на цьому порту за допомогою наступної команди

taskkill /F /PID <pid>

Чи є якась річ, як труба чи подібне, яку я можу використовувати в ОС Windows для запуску цієї команди в один рядок !?


1
Вибачте, що не можу написати повну відповідь зараз, але подивіться findstr(Windows grep). Наприклад: netstat -a -o -n | findstr "LISTENING" | findstr ":135". Можливо, це
зробить

@OliverSalzburg Потрібно бути обережним з цим другим findstr: може відповідати або місцевому, або віддаленому номеру порту. (Приймаючи, що Q не визначає, який.)
Річард

Відповіді:


10

Чи є якась річ, як труба або подібне, яку я можу використовувати в ОС Windows для запуску цієї команди в одному рядку?

Обидва cmd.exeта PowerShell підтримують труби від однієї команди до іншої. У PowerShell щось подібне (це повинно бути в одному рядку в командному рядку або використовувати `, щоб уникнути нових рядків у сценарії):

netstat -ano
 | select -skip 4 
 | % {$a = $_ -split ' {3,}'; New-Object 'PSObject' -Property @{Original=$_;Fields=$a}} 
 | ? {$_.Fields[1] -match '15120$'}
 | % {taskkill /F /PID $_.Fields[4] }

Де:

  • Select -skip 4пропускає перші чотири рядки заголовка. ( Selectкороткий для Select-Objectвикористання у виконанні SQL SELECT подібних проектів об'єктів.
  • %є коротким, для Foreach-Objectякого виконується блок скриптів на кожному об'єкті ( $_) в конвеєрі і виводить результати сценарію блоку на конвеєр. Тут він спочатку розбиває вхід на масив полів, а потім створює свіжий об'єкт з двома властивостями Original- рядок з netstatта Fieldsщойно створений масив.
  • ?Короткий, для Where-Objectякого фільтри засновані на результаті блоку скриптів. Тут узгоджується регулярний вираз в кінці другого поля (усі PowerShell контейнери нульові).

(Усі перевірені, крім останнього елемента: я не хочу починати процеси вбивства :-)).

На практиці я би спростив це, наприклад. повертаючи тільки 0 або PID від першого foreach(який би розрахований на ігнорування заголовків) і фільтрують значення, яке не дорівнює нулю, перш ніж викликати taskkill. Це буде швидше набрати, але важче дотримуватися, не знаючи PowerShell.


чомусь моя повноваження не визнає вибір! У ОС Windows 7 "Der Befehl" виберіть "ist entweder falsch geschrieben oder konnte nicht gefunden werden." Те саме для "Select-Object"
Арман

Це працювало для мене, але процес виявляється двічі, я вважаю, через версії IPv4 та IPv6, які перераховуються netstat. Це призводить до (ймовірно, нешкідливої) помилки ERROR: The process "12345" not found..
Скотт Велдон

Я думаю, що тут важливий вихід taskkill /F /PID [PID]. З цим хтось може вручну вбивати завдання, якщо у них є спосіб отримати PID.
Sawtaytoes

1

Відкрити командний рядок та виконати:

for /f "tokens=5" %a in ('netstat -aon ^| find "8080"') do taskkill /f /pid %a

Якщо ви хочете зробити це в .bat, замініть % a на %% a .

Якщо ви просто хочете вбити того, хто слухає на цьому порту, додайте (^ | знайдіть "LISTENING") наприкінці іншої знахідки.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.