Windows: najszybszy sposób na zabicie procesu uruchomionego na określonym porcie

11

Omawiam ten proces wiele razy. Muszę zabić proces na komputerze z systemem Windows i po prostu znam jego port. Zwykle kroki są następujące: Znajdź PID, patrząc na porty (przykładowy port 8084) Wymień procesy działające na portach

netstat -a -o -n

A następnie zabij proces na tym porcie za pomocą następującego polecenia

taskkill /F /PID <pid>

Czy istnieje coś takiego jak potok lub podobny element, którego można użyć w systemie operacyjnym Windows do uruchomienia tego polecenia w jednym wierszu !?

Armand
źródło
1
Przykro mi, że nie mogę teraz napisać pełnej odpowiedzi, ale spójrz na findstr(Windows grep). Na przykład: netstat -a -o -n | findstr "LISTENING" | findstr ":135". Może to przybliża cię o krok;)
Der Hochstapler
@OliverSalzburg Trzeba uważać na to drugie findstr: może pasować do lokalnego lub zdalnego numeru portu. (Przyjmując, że Q nie określa, które).
Richard

Odpowiedzi:

10

Czy jest coś takiego jak potok lub podobny element, którego można użyć w systemie operacyjnym Windows do uruchomienia tego polecenia w jednym wierszu?

Zarówno cmd.exei PowerShell obsługują potoki z jednego polecenia do drugiego. W PowerShell coś podobnego (powinien znajdować się w jednym wierszu w wierszu poleceń lub użyj `, aby wstawić znaki nowej linii w skrypcie):

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

Gdzie:

  • Select -skip 4pomija pierwsze cztery linie nagłówka. ( Selectjest skrótem od Select-Objectużywanego do wykonywania SQL SELECT podobnie jak projektów obiektów.
  • %jest skrótem od Foreach-Objectktórego wykonuje blok skryptu na każdym obiekcie ( $_) w potoku i wysyła wyniki bloku skryptu do potoku. Tutaj najpierw rozbija dane wejściowe na tablicę pól, a następnie tworzy nowy obiekt z dwiema właściwościami, z których Originalutworzono ciąg netstati Fieldstablicę.
  • ?jest skrótem, dla Where-Objectktórego filtry oparte na wyniku bloku skryptu. Tutaj dopasowanie wyrażenia regularnego na końcu drugiego pola (wszystkie kontenery PowerShell są zerowane).

(Wszystkie przetestowane oprócz ostatniego elementu: Nie chcę zaczynać procesów zabijania :-)).

W praktyce uprościłbym to, np. zwracanie tylko 0 lub PID od pierwszego foreach(który zostałby zaprojektowany w celu zignorowania nagłówków) i filtrowanie wartości niezerowej przed wywołaniem taskkill. Byłoby to szybsze pisanie, ale trudniejsze do naśladowania bez znajomości PowerShell.

Richard
źródło
z jakiegoś powodu mój PowerShell nie rozpoznaje zaznaczenia! W systemie Windows 7 „Der Befehl” wybierz „ist entweder falsch geschrieben oder konnte nicht gefunden werden”. To samo dla „Select-Object”
Armand
To zadziałało dla mnie, ale proces ten został znaleziony dwukrotnie, uważam, że ze względu na listę wersji IPv4 i IPv6 netstat. Prowadzi to do (prawdopodobnie nieszkodliwego) błędu ERROR: The process "12345" not found..
Scott Weldon,
Myślę, że tutaj najważniejsze jest wynos taskkill /F /PID [PID]. Dzięki temu ktoś może ręcznie zabijać zadania, o ile ma sposób na uzyskanie PID.
Sawtaytoes
1

Otwórz wiersz polecenia i wykonaj:

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

Jeśli chcesz to zrobić w .bat, zamień % a na %% a .

Jeśli chcesz tylko zabić tego, który nasłuchuje na tym porcie, dołącz (^ | znajdź „LISTENING”) na końcu drugiego znaleziska.

Josep Alsina
źródło