Ответ 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 автоматически сглаживает массив при его передаче, но этого можно избежать, добавив оператор ,
. Специальная переменная $_
затем используется как нормальная для встраивания переданного массива.
Итак, ключ состоит в том, чтобы обернуть конвейер, который вы хотите собрать, в ,@(...)
, а затем передать его чему-то в %{...}
.