什么相当于PowerShell中的xargs?

sim*_*nwo 28 powershell xargs

POSIX定义的xargs命令通吃它从标准输入接收物品并将它们作为命令行参数来接收它自己的命令行命令.例如:grep -rn "String" | xargs rm.

什么是PowerShell中的等价物?

以下问题都是这样问的:

但没有正确的答案,因为所有的答案要么使用ForEach-Object,它会一次一个地处理项目(比如xargs -n1),它会得到所给出的例子的预期结果,或者将中间结果存储在变量中,这会冒犯我的功能命令行福.

sim*_*nwo 32

我找到了两种方法.第一个可能是更惯用的PowerShell,第二个更忠实于基于管道的精神xargs.

举个例子,假设我们希望将所有的猫图片传递给myapp.exe.

方法#1:命令替换

您可以sh通过在命令字符串中嵌入管道来执行类似于使用$(命令替换)的操作:

&"myapp.exe" @(Get-ChildItem -Recurse -Filter *.jpg | Another-Step)
Run Code Online (Sandbox Code Playgroud)

@(...)内部它创建从命令的数组,和PowerShell自动扩展传递到阵列&成单独的命令行参数.

但是,这并没有真正回答这个问题,因为它只有在您可以控制要传递给的命令时才会起作用,这可能不是这种情况.

方法#2:真正的管道

您还可以通过使用子表达式来管理对象,将它们收集到数组,然后将数组传递给最终命令来构造"双管道".

,@(Get-ChildItem -Recurse -Filter *.jpg | Another-Step) | %{&"myapp.exe" $_}
Run Code Online (Sandbox Code Playgroud)

@(...)如前收集的物品到一个数组,并且该阵列然后管道输送到其使用调用的最后的命令%(ForEach-Object).通常,这会分别循环遍历每个项目,因为PowerShell会在管道传输时自动展平阵列,但这可以通过预先添加,运算符来避免.所述$_然后特殊变量被用作正常嵌入传递的数组.

所以关键是要包装你想要收集的管道,@(...),然后将其管道输入%{...}.

  • 哇.这很糟糕.这应该是powershell中的本机运算符.在%{&"foo"}的某个地方,我只是想放弃. (17认同)
  • 你也可以使用`Foreach($ x in(expression)){}`,这与xargs不太相似,但对嵌套对象有帮助. (7认同)
  • 我还有另一个问题:您编写 *PowerShell 自动将传递给 `&` 的数组扩展为单独的命令行参数*。据我在 PowerShell 7 上看到的,这是执行可执行文件的行为,无论它们是使用 `&` 还是不使用 (`"myapp.exe" @(Get-ChildItem -Recurse -Filter *.jpg |另一步)`也有效。 (2认同)

小智 9

我以前遇到过这样的问题

在 PowerShell 中您可以使用:

docker ps -aq | ForEach-Object { docker rm $_ }
Run Code Online (Sandbox Code Playgroud)


Ian*_*vis 6

我一直在使用这个过滤器进行基本xargs执行。

filter xargs { ($h,$t) = $args; & $h ($t + $_) }
Run Code Online (Sandbox Code Playgroud)

这大致相当于:

filter xargs { & $args[0] ($args[1..$args.length] + $_) }
Run Code Online (Sandbox Code Playgroud)

例子

 docker ps -q | xargs docker stop

 gem list | % { $_.split()[0] } | xargs gem uninstall -aIx
Run Code Online (Sandbox Code Playgroud)