POSIX-defined xargs
command 获取从标准输入接收的所有项目,并将它们作为命令行参数传递给它在自己的命令行上接收的命令。例如:grep -rn "String" | xargs rm
.
PowerShell 中的等效项是什么?
以下问题都问这个:
但是没有正确答案,因为所有答案要么使用 ForEach-Object
,它将一次处理一个项目(例如 xargs -n1
),从而获得给定示例的所需结果,或者将中间结果存储在变量中,这会冒犯我的功能命令行。
最佳答案
我发现有两种方法。第一个可能是更惯用的 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 在通过管道传输时会自动展平数组,但可以通过在前面添加 ,
运算符来避免这种情况。然后像平常一样使用 $_
特殊变量来嵌入传递的数组。
所以关键是将要收集的管道包装在 ,@(...)
中,然后通过管道将其传输到 %{...}
中的内容>.
关于powershell - PowerShell 中的 xargs 相当于什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36428949/