Windows: самый быстрый способ убить процесс, запущенный на определенном порту

11

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

netstat -a -o -n

А затем убить процесс на этом порту с помощью следующей команды

taskkill /F /PID <pid>

Есть ли что-то вроде конвейера или чего-то подобного, что я могу использовать в ОС Windows для запуска этой команды в одну строку !?

Armand
источник
1
Мне жаль, что я не могу написать полный ответ прямо сейчас, но посмотрите на findstr(Windows grep). Например: netstat -a -o -n | findstr "LISTENING" | findstr ":135". Может быть, это делает вас на шаг ближе;)
Der Hochstapler
@OliverSalzburg Нужно быть осторожным с этим вторым findstr: может совпадать с номером локального или удаленного порта. (Принятие, что Q не определяет, какой.)
Ричард

Ответы:

10

Есть ли что-то вроде конвейера или чего-то подобного, что я могу использовать в ОС Windows для запуска этой команды в одну строку?

И cmd.exePowerShell, и 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.

Ричард
источник
по какой-то причине мой 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 .

Если вы просто хотите убить того, кто прослушивает этот порт, добавьте (^ | find "LISTENING") в конце другого find.

Хосеп Альсина
источник