POSIX-defined xargs
命令获取从标准输入接收到的所有项,并将它们作为命令行参数传递给在自己的命令行上接收到的命令。grep -rn "String" | xargs rm
.
- PowerShell中的等效功能是什么?**
下面的问题都是这样问的:
但是不存在正确答案,因为所有答案或者使用ForEach-Object
,其将一次处理一个项目(如xargs -n1
),这对于给定的示例得到期望的结果,或者将中间结果存储在变量中,这违反了我的功能命令行-fu。
POSIX-defined xargs
命令获取从标准输入接收到的所有项,并将它们作为命令行参数传递给在自己的命令行上接收到的命令。grep -rn "String" | xargs rm
.
下面的问题都是这样问的:
但是不存在正确答案,因为所有答案或者使用ForEach-Object
,其将一次处理一个项目(如xargs -n1
),这对于给定的示例得到期望的结果,或者将中间结果存储在变量中,这违反了我的功能命令行-fu。
4条答案
按热度按时间i86rm4rw1#
我发现有两种方法,第一种可能是更惯用的PowerShell,第二种更符合
xargs
基于管道的精神。举个例子,假设我们想把所有的猫图片传递给
myapp.exe
。方法#1:命令替换
通过将管道嵌入到命令字符串中,可以执行类似于在
sh
中使用$(命令替换)的操作:@(...)
从它内部的命令创建一个数组,PowerShell自动将传递给&
的数组扩展为单独的命令行参数。但是,这并没有真正回答问题,因为只有当您对要传递到的命令具有控制权时,它才会起作用,而实际情况可能并非如此。
方法#2:真管涌
您还可以构造"双管道",方法是使用子表达式来输送对象,将它们收集到一个数组中,然后将该数组输送到您的最终命令。
@(...)
像以前一样将项目收集到一个数组中,然后通过管道将数组传送到使用%
调用的最终命令(ForEach-Object
)。通常,这将分别循环遍历每个项,因为PowerShell将在管道化数组时自动将其扁平化,但这可以通过预先添加,
操作符来避免。然后,$_
特殊变量被正常用于嵌入传递的数组。因此,关键是将您要收集的管道 Package 在
,@(...)
中,然后将其通过管道传输到%{...}
中的某个对象。vshtjzan2#
我一直在基本的
xargs
执行中使用这个过滤器。大致相当于:
示例
qij5mzcb3#
我认为最接近的方法是使用Splatting,在这个例子中,我使用
foreach
循环来收集所有的流水线值,以扩展未命名的位置参数:现在测试:
注意,这不适用于命名参数和标志--它只传递纯位置参数,因此它最适合于非cmdlet。
这也意味着我强烈建议您不要尝试
'-WhatIf' | Xargs Remove-WholeSystem
。htzpubme4#
我以前也有过这样的问题
在PowerShell中,您可以用途: