Windows: วิธีที่เร็วที่สุดในการฆ่ากระบวนการที่ทำงานบนพอร์ตเฉพาะ


11

ฉันกำลังจะผ่านกระบวนการนี้หลายครั้ง ฉันต้องฆ่ากระบวนการในเครื่อง Windows และฉันรู้ว่าพอร์ตของมัน โดยปกติแล้วขั้นตอนต่าง ๆ ดังต่อไปนี้: ค้นหา PID โดยดูที่พอร์ต (ตัวอย่างพอร์ต 8084) แสดงรายการกระบวนการที่ทำงานบนพอร์ต

netstat -a -o -n

จากนั้นฆ่ากระบวนการบนพอร์ตนั้นด้วยคำสั่งต่อไปนี้

taskkill /F /PID <pid>

มีสิ่งใดที่เหมือนกับไพพ์หรือคล้ายกันที่ฉันสามารถใช้บน Windows OS เพื่อรันคำสั่งนี้ในหนึ่งบรรทัด!


1
ฉันขอโทษที่ฉันไม่สามารถเขียนคำตอบเต็มรูปแบบได้ในขณะนี้ แต่ดูfindstr(Windows grep) ตัวอย่างเช่นnetstat -a -o -n | findstr "LISTENING" | findstr ":135". บางทีนี่อาจทำให้คุณใกล้ขึ้นอีกขั้นหนึ่ง)
Der Hochstapler

@OliverSalzburg ต้องระวังด้วยลำดับที่ 2 findstr: อาจตรงกับหมายเลขพอร์ตท้องถิ่นหรือระยะไกล (ยอมรับว่าคำถามนั้นไม่ได้ระบุว่าอะไร)
Richard

คำตอบ:


10

มีสิ่งใดเช่นไพพ์หรือคล้ายกันที่ฉันสามารถใช้บน Windows OS เพื่อรันคำสั่งนี้ในหนึ่งบรรทัด?

ทั้งสองcmd.exeและ PowerShell สนับสนุนไพพ์จากคำสั่งหนึ่งไปอีกคำสั่งหนึ่ง ใน PowerShell มีลักษณะดังนี้ (ควรเป็นบรรทัดเดียวในบรรทัดคำสั่งหรือใช้ `เพื่อ escapte บรรทัดใหม่ในสคริปต์):

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ที่ตัวกรองจะขึ้นอยู่กับผลลัพธ์ของบล็อกสคริปต์ ที่นี่จับคู่ regex ที่ส่วนท้ายของฟิลด์ที่สอง (PowerShell ทั้งหมดคอนเทนเนอร์ตามศูนย์)

(ทดสอบทั้งหมดยกเว้นองค์ประกอบสุดท้าย: ฉันไม่ต้องการเริ่มกระบวนการฆ่า :-))

ในทางปฏิบัติฉันจะทำให้สิ่งนี้ง่ายขึ้นเช่น กลับมาเพียง 0 หรือ PID จากครั้งแรกforeach(ซึ่งจะได้รับการออกแบบที่จะไม่สนใจส่วนหัว) taskkillและกรองค่าไม่เป็นศูนย์ก่อนที่จะเรียก สิ่งนี้จะพิมพ์ได้เร็วขึ้น แต่ยากที่จะติดตามโดยไม่ทราบว่า PowerShell


ด้วยเหตุผลบางอย่าง PowerShell ของฉันไม่รู้จักตัวเลือก! การรัน Windows 7 "Der Befehl" select "ist entweder falsch geschrieben oder konnte nicht gefunden werden" เหมือนกันสำหรับ "เลือกวัตถุ"
อาร์มันด์

นี้ทำงานสำหรับฉัน แต่กระบวนการที่พบครั้งที่สองผมเชื่อว่าเนื่องจาก IPv4 และ IPv6 netstatรุ่นถูกระบุไว้โดย นำไปสู่ข้อผิดพลาด (อาจจะไม่เป็นอันตราย) ERROR: The process "12345" not found.นี้
Scott Weldon

ผมคิดว่า Takeaway taskkill /F /PID [PID]ที่สำคัญที่นี่คือ ด้วยวิธีนี้บางคนสามารถฆ่าภารกิจได้ด้วยตนเองตราบใดที่มีวิธีรับ PID
Sawtaytoes

1

เปิดพร้อมรับคำสั่งและดำเนินการ:

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

ถ้าคุณต้องการที่จะทำมันในค้างคาวที่แทนที่% และสำหรับ%%

หากคุณเพียงต้องการที่จะฆ่าคนที่ฟังพอร์ตนั้นผนวก (^ | ค้นหา "LISTENING") ที่ส่วนท้ายของการค้นหาอื่น ๆ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.