Что эквивалентно xargs в PowerShell?

POSIX-определенная команда xargs принимает все элементы, которые она получает от стандартного ввода, и передает их в качестве аргументов командной строки для команда получает на нее собственную командную строку. Например: grep -rn "String" | xargs rm.

Что эквивалентно в PowerShell?

Следующие вопросы задают следующее:

но нет правильного ответа, потому что во всех ответах используется ForEach-Object, который будет обрабатывать элементы по одному (например, xargs -n1), который получает желаемый результат для приведенных примеров или сохраняет промежуточный приводят к переменной, которая оскорбляет мою функциональную командную строку-fu.

Ответ 1

Есть два пути, которые я нашел. Первый, вероятно, более идиоматический PowerShell, а второй более верен духу на основе труб xargs.

В качестве примера предположим, что мы хотим передать все наши фотографии для кошек myapp.exe.

Метод # 1: Замена команд

Вы можете сделать что-то похожее на использование $(подстановки команд) в sh путем встраивания вашего конвейера в строку команды:

&"myapp.exe" @(Get-ChildItem -Recurse -Filter *.jpg | Another-Step)

@(...) создает массив из команды внутри него, а PowerShell автоматически расширяет массивы, переданные в &, в отдельные параметры командной строки.

Однако это не отвечает на вопрос, потому что он будет работать, только если у вас есть контроль над командой, к которой вы хотите перейти, что может и не быть.

Метод №2: Истинный трубопровод

Вы также можете построить "двойной конвейер", имея подвыражение для соединения ваших объектов, сбора их в массив и последующего соединения массива с конечной командой.

,@(Get-ChildItem -Recurse -Filter *.jpg | Another-Step) | %{&"myapp.exe" $_}

@(...) по-прежнему собирает элементы в массив, а затем массив передается в конечную команду, которая вызывается с помощью % (ForEach-Object). Обычно это будет циклически перебирать каждый элемент отдельно, потому что PowerShell автоматически сглаживает массив при его передаче, но этого можно избежать, добавив оператор ,. Специальная переменная $_ затем используется как нормальная для встраивания переданного массива.

Итак, ключ состоит в том, чтобы обернуть конвейер, который вы хотите собрать, в ,@(...), а затем передать его чему-то в %{...}.

Ответ 2

Любой, кто приходит сюда для докера в Windows, использует $ _.

echo boring_hamilton sharp_galois stupefied_cori festive_feynman | %{docker rm $_}