%{}
不是“一件事”——它是两件事:%
和{}
%
是ForEach-Object
cmdlet的别名:
PS ~> Get-Alias '%'
CommandType Name Version Source
----------- ---- ------- ------
Alias % -> ForEach-Object
...所以它解析为:
... |ForEach-Object { $_.FullName }
ForEach-Object
基本上是 PowerShell 的map
功能- 它通过管道获取输入并将{}
块中描述的操作应用于它们中的每一个。
$_
是对正在处理的当前管道输入项的自动引用
你可以把它想象成一个foreach($thing in $collection){}
循环:
1..10 |ForEach-Object { $_ * 10 }
# produces the same output as
foreach($n in 1..10){
$n * 10
}
除了我们现在可以将循环放在管道中间并让它产生输出以供立即使用:
1..10 |ForEach-Object { $_ * 10 } |Do-SomethingElse
ForEach-Object
不是唯一$_
在 PowerShell 中使用自动变量的东西 - 它也用于管道绑定表达式:
mkdir NewDirectory |cd -Path { $_.FullName }
...以及属性表达式,一种由许多 cmdlet 支持的动态属性定义,例如Sort-Object
:
1..10 |Sort-Object { -$_ } # sort in descending order without specifying -Descending
... Group-Object
:
1..10 |Group-Object { $_ % 3 } # group terms by modulo congruence
...和Select-Object
:
1..10 |Select-Object @{Name='TimesTen';Expression={$_ * 10}} # Create synthetic properties based on dynamic value calculation over input