什么';在PowerShell中,它相当于xargs?

什么';在PowerShell中,它相当于xargs?,powershell,xargs,Powershell,Xargs,该命令获取它从标准输入接收的所有项,并将它们作为命令行参数传递给它在自己的命令行上接收的命令。例如:grep-rn“String”| xargs rm PowerShell中的等价物是什么? 以下问题都提出了这个问题: 但是没有正确的答案,因为所有答案要么使用ForEach对象,该对象将一次一个地处理项目(如xargs-n1),从而获得给定示例所需的结果,要么将中间结果存储在变量中,这冒犯了我的功能命令行fu。我发现了两种方法。第一种可能是更惯用的PowerShell,第二种更符合xar

该命令获取它从标准输入接收的所有项,并将它们作为命令行参数传递给它在自己的命令行上接收的命令。例如:
grep-rn“String”| xargs rm

PowerShell中的等价物是什么?

以下问题都提出了这个问题:


但是没有正确的答案,因为所有答案要么使用
ForEach对象
,该对象将一次一个地处理项目(如
xargs-n1
),从而获得给定示例所需的结果,要么将中间结果存储在变量中,这冒犯了我的功能命令行fu。

我发现了两种方法。第一种可能是更惯用的PowerShell,第二种更符合
xargs
基于管道的精神

例如,假设我们想将所有cat图片传递到
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对象
)调用的最终命令。通常情况下,这将分别在每个项目上循环,因为PowerShell将在对阵列进行管道传输时自动展平阵列,但这可以通过预先添加
操作符来避免。然后使用
$\uuu
特殊变量作为普通变量嵌入传递的数组


因此,关键是将要收集的管道包装在
,@(…)
中,然后将其输送到
%{…}

中的某个位置。我一直在使用此过滤器执行基本的
xargs

filter xargs { ($h,$t) = $args; & $h ($t + $_) }
这大致相当于:

filter xargs { & $args[0] ($args[1..$args.length] + $_) }
例子

 docker ps -q | xargs docker stop

 gem list | % { $_.split()[0] } | xargs gem uninstall -aIx

您还可以使用
Foreach($x in(expression)){}
,它与xargs不太相似,但对嵌套对象很有帮助。这太糟糕了。这应该是powershell中的本机运算符。在%{&“foo”}的某个地方我只是想放弃。
另一个步骤
能做什么?@RenéNyffenegger这只是一个输出某些东西用作命令行参数的步骤的示例。我还有一个问题:编写PowerShell会自动将传递给
&
的数组扩展为单独的命令行参数。据我在PowerShell 7上看到的,这是执行可执行文件的行为,不管它们是使用
&
执行还是不使用(
“myapp.exe”@(Get ChildItem-Recurse-Filter*.jpg |另一步)
同样有效。
xargs-n1
也很有用。
find…| while read f;do…| done
…在PS中凭直觉做这件事几乎是不可能的。我喜欢语法糖,但不过滤一次处理一个项目,比如
xargs-n1
和链接的示例?例如
ls;回显“hello”
将“hello”附加到输出的每一行。@simonwo如果您是正确的,
ls | xargs-n1 echo“hello”
将在每个项目之前打印
hello
但是
ls | xargs echo“hello”
只在所有文本输出之前打印hello一次。在powershell中,使用上述方法,
ls | xargs编写主机“hello”
将在每个项之前打印
hello
,如bash
-n1
选项。要复制正常的
xargs
行为,可以先将对象强制放入数组
,(ls)| xargs写入主机“hello”
。我的所有用例都属于
-n1
模式。可以将其更改为函数并扩展为接受更多参数,其行为与普通XARG类似。