Is there any thing like a pipe or similar that I can use on Windows OS to run this command in one line?
O cmd.exe
e o PowerShell suportam pipes de um comando para outro. No PowerShell algo como (isso deve estar em uma única linha na linha de comando ou usar '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
ignora as primeiras quatro linhas de cabeçalho. (Select
é a abreviação deSelect-Object
usado para executar SQL SELECT como projetos de objetos. -
%
é a abreviação deForeach-Object
, que executa um bloco de script em cada objeto ($_
) no pipeline e gera os resultados do bloco de script no pipeline. Aqui está primeiro dividindo a entrada em uma matriz de campos e, em seguida, criando um novo objeto com duas propriedadesOriginal
da sequência denetstat
eFields
da matriz que acabou de criar. -
?
é a abreviação deWhere-Object
, que é baseado no resultado de um bloco de script. Aqui corresponde a um regex no final do segundo campo (todos os contêineres do PowerShell são baseados em zero).
(Tudo testado, exceto o último elemento: 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
. Isso seria mais rápido de digitar, mas mais difícil de seguir sem conhecer o PowerShell.