Is there any thing like a pipe or similar that I can use on Windows OS to run this command in one line?
Both cmd.exe
and PowerShell support pipes from one command to another. In PowerShell something like (this should be on a single line on the command line, or use ` to escapte newlines in a 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] }
Where:
Select -skip 4
skips the first four header lines. (Select
is short for Select-Object
used to perform SQL SELECT like projects of objects.
%
is short for Foreach-Object
which performs a script block on each object ($_
) in the pipeline and outputs the results of the script block to the pipeline. Here it is first breaking up the input into an array of fields and then creating a fresh object with two properties Original
the string from netstat
and Fields
the array just created.
?
is short for Where-Object
which filters based on the result of a script block. Here matching a regex at the end of the second field (all PowerShell containers a zero based).
(All tested except the last element: I don't want to start killing processes :-)).
In practice I would simplify this, eg. returning just 0 or the PID from the first foreach
(which would be designed to ignore the headers) and filter on value not zero before calling taskkill
. This would be quicker to type but harder to follow without knowing PowerShell.
findstr
(the Windowsgrep
). For example:netstat -a -o -n | findstr "LISTENING" | findstr ":135"
. Maybe this gets you a step closer ;)findstr
: might match either local or remote port number. (Accepting that the Q doesn't specify which.)