约 2152 字

约 11 分钟

#遍历与聚合

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 等属性。

#推荐阅读

更新: 2026/11/2

作者: planc

创建: 2026/11/2