10

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

netstat -a -o -n

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

taskkill /F /PID <pid>

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

3 ответа3

9

Есть ли что-то вроде конвейера или чего-то подобного, что я могу использовать в ОС 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.

1

Вот удобная функция, которую вы можете использовать:

https://github.com/majkinetor/posh/blob/master/MM_Network/Stop-ProcessByPort.ps1

killp 8081
0

Откройте командную строку и выполните:

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

Если вы хотите сделать это в .bat, замените % a на %% a.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .