在PowerShell中,xargs的等价物是什么?

vvppvyoh  于 2023-02-19  发布在  Shell
关注(0)|答案(4)|浏览(316)

POSIX-defined xargs命令获取从标准输入接收到的所有项,并将它们作为命令行参数传递给在自己的命令行上接收到的命令。grep -rn "String" | xargs rm.

    • PowerShell中的等效功能是什么?**

下面的问题都是这样问的:

但是不存在正确答案,因为所有答案或者使用ForEach-Object,其将一次处理一个项目(如xargs -n1),这对于给定的示例得到期望的结果,或者将中间结果存储在变量中,这违反了我的功能命令行-fu。

i86rm4rw

i86rm4rw1#

我发现有两种方法,第一种可能是更惯用的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将在管道化数组时自动将其扁平化,但这可以通过预先添加,操作符来避免。然后,$_特殊变量被正常用于嵌入传递的数组。
因此,关键是将您要收集的管道 Package 在,@(...)中,然后将其通过管道传输到%{...}中的某个对象。

vshtjzan

vshtjzan2#

我一直在基本的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
qij5mzcb

qij5mzcb3#

我认为最接近的方法是使用Splatting,在这个例子中,我使用foreach循环来收集所有的流水线值,以扩展未命名的位置参数:

function Xargs {
    param(
        $Cmd
    )
    process {
        $args += ,$_
    }
    end {
        & $Cmd @args
    }
}

现在测试:

PS> '-c','"print(123)"' | Xargs python
123

注意,这不适用于命名参数和标志--它只传递纯位置参数,因此它最适合于非cmdlet。

这也意味着我强烈建议您不要尝试'-WhatIf' | Xargs Remove-WholeSystem

htzpubme

htzpubme4#

我以前也有过这样的问题
在PowerShell中,您可以用途:

docker ps -aq | ForEach-Object { docker rm $_ }

相关问题