什么';在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类似。