Existe algo como um pipe ou similar que eu possa usar no sistema operacional Windows para executar este comando em uma linha?
O cmd.exe
PowerShell e o suporte a canais de um comando para outro. No PowerShell, algo como (isso deve estar em uma única linha na linha de comando ou use `para escapar de novas linhas em um 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] }
Onde:
Select -skip 4
pula as quatro primeiras linhas do cabeçalho. ( Select
é a abreviação de Select-Object
usado para executar o SQL SELECT como projetos de objetos.
%
é curto para o Foreach-Object
qual executa um bloco de script em cada objeto ( $_
) no pipeline e gera os resultados do bloco de script no pipeline. Aqui, ele primeiro divide a entrada em uma matriz de campos e, em seguida, cria um objeto novo com duas propriedades das quais Original
a string netstat
e Fields
a matriz recém-criada.
?
é curto para Where-Object
quais filtros com base no resultado de um bloco de script. Aqui corresponde a uma regex no final do segundo campo (todos os contêineres do PowerShell são baseados em zero).
(Todos testados, exceto o último elemento: eu não quero começar a matar processos :-)).
Na prática, eu simplificaria isso, por exemplo. retornando apenas 0 ou o PID do primeiro foreach
(que seria projetado para ignorar os cabeçalhos) e filtrar o valor não zero antes de chamar taskkill
. Seria mais rápido digitar, mas mais difícil de seguir sem conhecer o PowerShell.
findstr
(o Windowsgrep
). Por exemplo:netstat -a -o -n | findstr "LISTENING" | findstr ":135"
. Talvez isso você fica um passo mais perto;)