我今天遇到过这个问题:
$tests = (Get-ChildItem . -Recurse -Name bin |% { Get-ChildItem $_ -Recurse -Filter *.Unit.Tests.dll } |% { $($_.FullName) })
Write-Host ------------- TESTS -----------
Write-Host $tests
Write-Host -------------------------------
.\tools\xunit\xunit.console.exe $tests -xml test-report.unit.xml
我无法理解' |%'在那里。谁能解释一下它的用途呢?
答案 0 :(得分:7)
%
是alias的the ForEach-Object
cmdlet。
别名只是您可以引用cmdlet或函数的另一个名称。例如,dir
,ls
和gci
都是Get-ChildItem
的别名。
ForEach-Object
为通过管道传递给它的每个项执行[ScriptBlock]
,因此将一个cmdlet的结果传递到ForEach-Object
可让您运行一些代码针对每个项目。
在您的示例中,Get-ChildItem
找到某个目录树中的所有bin
,然后找到找到的每个,Get-ChildItem
用于查找匹配*.Unit.Tests.dll
下面的所有文件,然后用于每个,将全名返回到管道(它被分配给{{ 1}}变量)。
答案 1 :(得分:1)
添加到@briantist的答案:
|
是管道运算符。来自docs:
每个管道运算符都将前一个命令的结果发送到下一个命令。
演示:
Get-ChildItem bin | % { Get-ChildItem $_ }
可以改写为:
Get-ChildItem bin | Foreach-Object { Get-ChildItem $_ }
或 without 使用管道,但使用foreach loop(与foreach command 不同!):
foreach ($item in (Get-ChildItem bin)) { Get-ChildItem $item }