Есть ли что-то вроде конвейера или чего-то подобного, что я могу использовать в ОС Windows для запуска этой команды в одну строку?
И cmd.exe
PowerShell, и PowerShell поддерживают каналы от одной команды к другой. В PowerShell что-то вроде (это должно быть в одной строке в командной строке или использовать `для экранирования строк в скрипте):
netstat -ano
| select -skip 4
| % {$a = $_ -split ' {3,}'; New-Object 'PSObject' -Property @{Original=$_;Fields=$a}}
| ? {$_.Fields[1] -match '15120$'}
| % {taskkill /F /PID $_.Fields[4] }
Где:
Select -skip 4
пропускает первые четыре строки заголовка. ( Select
сокращенно Select-Object
используется для выполнения SQL SELECT как проекты объектов.
%
это сокращение, Foreach-Object
которое выполняет блок скрипта для каждого объекта ( $_
) в конвейере и выводит результаты блока скрипта в конвейер. Здесь сначала разбиваются входные данные на массив полей, а затем создается новый объект с двумя свойствами, Original
из которых строка netstat
и Fields
только что созданный массив.
?
является сокращением, для Where-Object
которого фильтры основаны на результате блока скрипта. Здесь соответствие регулярному выражению в конце второго поля (все контейнеры PowerShell начинаются с нуля).
(Все протестировано, кроме последнего элемента: я не хочу начинать процессы уничтожения :-)).
На практике я бы упростил это, например. возвращая только 0 или PID от первого foreach
(который был бы разработан, чтобы игнорировать заголовки) и фильтровать по значению, отличному от нуля, перед вызовом taskkill
. Это будет быстрее набирать, но сложнее следовать, не зная PowerShell.
findstr
(Windowsgrep
). Например:netstat -a -o -n | findstr "LISTENING" | findstr ":135"
. Может быть, это делает вас на шаг ближе;)