Windows: Cách nhanh nhất để giết quá trình đang chạy trên một cổng cụ thể


11

Tôi đang đi qua quá trình này nhiều lần. Tôi phải giết một tiến trình trên máy Windows và tôi chỉ biết cổng của nó. Thông thường các bước như sau: Tìm bộ vi xử lý bằng cách xem các cổng (ví dụ cổng 8084) Liệt kê các quy trình đang chạy trên các cổng

netstat -a -o -n

Và sau đó giết tiến trình trên cổng đó bằng lệnh sau

taskkill /F /PID <pid>

Có thứ gì giống như ống hoặc tương tự mà tôi có thể sử dụng trên HĐH Windows để chạy lệnh này trong một dòng không!?


1
Tôi xin lỗi vì tôi không thể viết một câu trả lời đầy đủ ngay bây giờ, nhưng hãy xem findstr(Windows grep). Ví dụ : netstat -a -o -n | findstr "LISTENING" | findstr ":135". Có lẽ điều này giúp bạn tiến một bước gần hơn;)
Der Hochstapler

@OliverSalzburg Cần cẩn thận với lần thứ 2 findstr: có thể khớp với số cổng cục bộ hoặc từ xa. (Chấp nhận rằng Q không chỉ định cái nào.)
Richard

Câu trả lời:


10

Có điều gì giống như một đường ống hoặc tương tự mà tôi có thể sử dụng trên HĐH Windows để chạy lệnh này trong một dòng không?

Cả hai cmd.exevà PowerShell hỗ trợ các đường ống từ lệnh này sang lệnh khác. Trong PowerShell, một cái gì đó giống như (cái này phải nằm trên một dòng trên dòng lệnh hoặc sử dụng `để thoát dòng mới trong tập lệnh):

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

Ở đâu:

  • Select -skip 4bỏ qua bốn dòng tiêu đề đầu tiên. ( Selectviết tắt của từ Select-Objectđược sử dụng để thực hiện SQL SELECT giống như các dự án của các đối tượng.
  • %là viết tắt để Foreach-Objectthực hiện một khối tập lệnh trên mỗi đối tượng ( $_) trong đường ống và đưa ra kết quả của khối tập lệnh vào đường ống. Ở đây, đầu tiên, phân tách đầu vào thành một mảng các trường và sau đó tạo một đối tượng mới với hai thuộc tính Originalchuỗi từ netstatFieldsmảng vừa tạo.
  • ?là viết tắt của Where-Objectcác bộ lọc dựa trên kết quả của một khối tập lệnh. Ở đây khớp với biểu thức chính ở cuối trường thứ hai (tất cả các thùng chứa PowerShell đều dựa trên số không).

(Tất cả được kiểm tra ngoại trừ yếu tố cuối cùng: Tôi không muốn bắt đầu quá trình tiêu diệt :-)).

Trong thực tế tôi sẽ đơn giản hóa điều này, ví dụ. chỉ trả về 0 hoặc PID từ lần đầu tiên foreach(sẽ được thiết kế để bỏ qua các tiêu đề) và lọc theo giá trị không bằng 0 trước khi gọi taskkill. Điều này sẽ nhanh hơn để nhập nhưng khó theo dõi hơn mà không biết PowerShell.


vì một số lý do, quyền hạn của tôi không nhận ra sự lựa chọn! Chạy Windows 7 "Der Befehl" chọn "ist entweder falsch geschrieben oder konnte nicht gefunden werden." Tương tự cho "Chọn đối tượng"
Armand

Điều này làm việc cho tôi, nhưng quá trình này được tìm thấy hai lần, tôi tin là do các phiên bản IPv4 và IPv6 được liệt kê bởi netstat. Điều này dẫn đến một lỗi (có thể vô hại) của ERROR: The process "12345" not found..
Scott Weldon

Tôi nghĩ rằng takeaway quan trọng ở đây là taskkill /F /PID [PID]. Cùng với đó, ai đó có thể tự hủy các tác vụ miễn là họ có cách nhận được PID.
Sawtaytoes

1

Mở dấu nhắc lệnh và thực thi:

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

Nếu bạn muốn làm điều đó trong .bat, thay thế % a cho %% a .

Nếu bạn chỉ muốn giết người đang nghe trên cổng đó, hãy thêm vào (^ | tìm "LISTENING") ở cuối tìm kiếm khác.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.