在POSIX定义的xargs
命令通吃它从标准输入接收物品并将它们作为命令行参数来接收它自己的命令行命令.例如:grep -rn "String" | xargs rm
.
什么是PowerShell中的等价物?
以下问题都是这样问的:
但没有正确的答案,因为所有的答案要么使用ForEach-Object
,它会一次一个地处理项目(比如xargs -n1
),它会得到所给出的例子的预期结果,或者将中间结果存储在变量中,这会冒犯我的功能命令行福.
sim*_*nwo 32
我找到了两种方法.第一个可能是更惯用的PowerShell,第二个更忠实于基于管道的精神xargs
.
举个例子,假设我们希望将所有的猫图片传递给myapp.exe
.
您可以sh
通过在命令字符串中嵌入管道来执行类似于使用$(命令替换)的操作:
&"myapp.exe" @(Get-ChildItem -Recurse -Filter *.jpg | Another-Step)
Run Code Online (Sandbox Code Playgroud)
的@(...)
内部它创建从命令的数组,和PowerShell自动扩展传递到阵列&
成单独的命令行参数.
但是,这并没有真正回答这个问题,因为它只有在您可以控制要传递给的命令时才会起作用,这可能不是这种情况.
您还可以通过使用子表达式来管理对象,将它们收集到数组,然后将数组传递给最终命令来构造"双管道".
,@(Get-ChildItem -Recurse -Filter *.jpg | Another-Step) | %{&"myapp.exe" $_}
Run Code Online (Sandbox Code Playgroud)
在@(...)
如前收集的物品到一个数组,并且该阵列然后管道输送到其使用调用的最后的命令%
(ForEach-Object
).通常,这会分别循环遍历每个项目,因为PowerShell会在管道传输时自动展平阵列,但这可以通过预先添加,
运算符来避免.所述$_
然后特殊变量被用作正常嵌入传递的数组.
所以关键是要包装你想要收集的管道,@(...)
,然后将其管道输入%{...}
.
小智 9
我以前遇到过这样的问题
在 PowerShell 中您可以使用:
docker ps -aq | ForEach-Object { docker rm $_ }
Run Code Online (Sandbox Code Playgroud)
我一直在使用这个过滤器进行基本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)