#遍历与聚合
ForEach-Object 用于逐个处理管道中的对象,Measure-Object 用于统计数量、总和、平均值、最大值和最小值。PowerShell 7 还为 ForEach-Object 提供了 -Parallel 参数,用于并行处理。
#ForEach-Object 遍历
对每个对象执行脚本块:
> Get-Process | ForEach-Object { $_.ProcessName }
> Get-ChildItem -File | ForEach-Object { $_.Name.ToUpper() }
$_表示当前对象,也可以写作$PSItem。- 脚本块中产生的输出会继续传递到管道下游。
#Begin、Process、End
-Begin、-Process 和 -End 分别定义处理开始前、每个对象处理和全部处理结束时的脚本块:
> 1..5 | ForEach-Object -Begin { $sum = 0 } -Process { $sum += $_ } -End { $sum }
15
-Begin只执行一次。-Process对每个输入对象执行一次。-End在全部对象处理完后执行一次。- 直接传入一个脚本块时,该脚本块会作为
-Process使用。
#Measure-Object 聚合
Measure-Object 可以对属性值求和、求平均、求最大值和最小值:
> 1, 2, 3, 4 | Measure-Object -Sum -Average -Maximum -Minimum
Count : 4
Average : 2.5
Sum : 10
Maximum : 4
Minimum : 1
对文件大小进行统计:
> Get-ChildItem -File | Measure-Object -Property Length -Sum
> Get-ChildItem -File | Measure-Object -Property Length -Average -Maximum -Minimum
不指定 -Property 时,主要用于统计对象数量:
> Get-ChildItem -File | Measure-Object
#ForEach-Object -Parallel 并行处理
PowerShell 7 支持并行处理:
> 1..5 | ForEach-Object -Parallel { $_ * 2 } -ThrottleLimit 2
使用 $using: 引用外层作用域中的变量:
> $factor = 2
> 1..5 | ForEach-Object -Parallel { $_ * $using:factor }
-Parallel为每个输入对象使用独立的运行空间。-ThrottleLimit控制同时执行的任务数量。- 并行执行适合耗时较长的独立操作,普通轻量任务可能因开销而不划算。
#注意事项
- 并行脚本块中不能直接访问外层普通变量,需要使用
$using:变量名。 - 避免在并行脚本块中修改共享对象;需要共享结果时应使用线程安全的方式收集。
Measure-Object的统计结果是一个对象,可以继续选择Sum、Average等属性。