Есть ли что-то вроде конвейера или чего-то подобного, что я могу использовать в ОС Windows для запуска этой команды в одну строку?
И cmd.exe
и 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.