¿Cuál es el equivalente de xargs en PowerShell?
(1)
El comando xargs
definido por POSIX toma todos los elementos que recibe de la entrada estándar y los pasa como argumentos de línea de comandos al comando que recibe en su propia línea de comandos. Por ejemplo: grep -rn "String" | xargs rm
grep -rn "String" | xargs rm
.
¿Cuál es el equivalente en PowerShell?
Las siguientes preguntas todas hacen esto:
- ¿Convertir el comando Bash xargs a PowerShell?
- ¿Cuál es el equivalente de PowerShell de este comando Bash?
pero no hay una respuesta correcta porque todas las respuestas usan ForEach-Object
, que procesará los elementos uno a la vez (como xargs -n1
) que obtiene el resultado deseado para los ejemplos dados, o almacena el resultado intermedio en una Variable, que ofende mi línea de comandos funcional-fu.
Hay dos formas que he encontrado. El primero es probablemente PowerShell más idiomático, y el segundo es más fiel al espíritu basado en tuberías de xargs
.
Como ejemplo, digamos que queremos pasar todas las fotos de nuestros gatos a myapp.exe
.
Método # 1: Sustitución de comandos
Puede hacer algo similar a usar $ (sustitución de comando) en sh
incrustando su canalización en la cadena de comando:
&"myapp.exe" @(Get-ChildItem -Recurse -Filter *.jpg | Another-Step)
@(...)
crea una matriz desde el comando que se encuentra dentro, y PowerShell expande automáticamente las matrices pasadas hacia &
dentro de los parámetros separados de la línea de comando.
Sin embargo, esto realmente no responde a la pregunta, ya que solo funcionará si tiene control sobre el comando al que desea pasar, lo que puede no ser el caso.
Método # 2: tubería verdadera
También puede construir una "tubería doble" teniendo una subexpresión para canalizar sus objetos, recolectándolos en una matriz y luego canalizando la matriz a su comando final.
,@(Get-ChildItem -Recurse -Filter *.jpg | Another-Step) | %{&"myapp.exe" $_}
El @(...)
como antes recopila los elementos en una matriz, y la matriz se canaliza al comando final que se invoca usando %
( ForEach-Object
). Por lo general, esto pasaría por cada elemento individualmente, ya que PowerShell aplanará automáticamente la matriz cuando se canaliza, pero esto puede evitarse antes de que aparezca el operador. La variable especial $_
luego se usa como normal para incrustar la matriz pasada.
Entonces, la clave es envolver el conducto que desea recopilar ,@(...)
, y luego canalizarlo a algo en %{...}
.