Windows: il modo più rapido per terminare un processo in esecuzione su una porta specifica


11

Sto superando questo processo molte volte. Devo interrompere un processo su un computer Windows e conosco solo la sua porta. Normalmente i passaggi sono i seguenti: Trova il PID guardando le porte (esempio porta 8084) Elenca i processi in esecuzione sulle porte

netstat -a -o -n

E quindi uccidi il processo su quella porta con il seguente comando

taskkill /F /PID <pid>

C'è qualcosa come una pipe o simile che posso usare sul sistema operativo Windows per eseguire questo comando su una riga !?


1
Mi dispiace di non poter scrivere una risposta completa in questo momento, ma dai un'occhiata a findstr(Windows grep). Ad esempio: netstat -a -o -n | findstr "LISTENING" | findstr ":135". Forse questo ti avvicina di un passo;)
Der Hochstapler il

@OliverSalzburg Bisogna fare attenzione a quel secondo findstr: potrebbe corrispondere al numero di porta locale o remoto. (Accettando che la Q non specifichi quale.)
Richard

Risposte:


10

C'è qualcosa come una pipe o simile che posso usare sul sistema operativo Windows per eseguire questo comando su una riga?

Entrambi cmd.exee PowerShell supportano le pipe da un comando all'altro. In PowerShell qualcosa di simile (dovrebbe essere su una sola riga sulla riga di comando, oppure usare `per sfuggire a nuove righe in uno script):

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

Dove:

  • Select -skip 4salta le prime quattro righe di intestazione. ( Selectè l'abbreviazione di Select-Objectusato per eseguire SQL SELECT come progetti di oggetti.
  • %è l'abbreviazione per Foreach-Objectcui esegue un blocco di script su ciascun oggetto ( $_) nella pipeline e restituisce i risultati del blocco di script alla pipeline. Qui viene prima suddiviso l'input in una matrice di campi e quindi creando un nuovo oggetto con due proprietà Originaldalla stringa netstate Fieldsdalla matrice appena creata.
  • ?è l'abbreviazione di Where-Objectquali filtri basati sul risultato di un blocco di script. Qui corrisponde una regex alla fine del secondo campo (tutti i contenitori di PowerShell sono basati su zero).

(Tutti testati tranne l'ultimo elemento: non voglio iniziare i processi di uccisione :-)).

In pratica semplificherei questo, ad es. restituendo solo 0 o il PID dal primo foreach(che sarebbe progettato per ignorare le intestazioni) e filtrare su un valore non zero prima di chiamare taskkill. Questo sarebbe più veloce da digitare ma più difficile da seguire senza conoscere PowerShell.


per qualche motivo il mio PowerShell non riconosce la selezione! Eseguendo Windows 7 "Der Befehl" selezionare "è un file errato che non è possibile trovare". Lo stesso vale per "Select-Object"
Armand,

Questo ha funzionato per me, ma il processo si trova due volte, credo a causa delle versioni IPv4 e IPv6 elencate da netstat. Questo porta a un errore (probabilmente innocuo) di ERROR: The process "12345" not found..
Scott Weldon,

Penso che l'importante da asporto qui sia taskkill /F /PID [PID]. Con ciò, qualcuno può uccidere manualmente le attività purché abbiano un modo per ottenere il PID.
Sawtaytoes,

1

Apri il prompt dei comandi ed esegui:

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

Se vuoi farlo in un .bat, sostituisci % a per %% a .

Se vuoi semplicemente uccidere quello che è in ascolto su quella porta aggiungi (^ | find "LISTENING") alla fine dell'altro find.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.